# 基础类型定义

TS类型定义:在声明变量时使用变量名+“:”+变量类型的方式

# 定义基础类型

//定义字符串
let str: string = '张三'
//定义数字
let num: number = 100
//定义布尔值
let bool: boolean = true

# 联合类型

如一个变量可能有多种类型,则使用联合类型定义

let name: string | number | boolean = 11

# 定义数字数组

定义数字数组 数组元素只能是数字

# 定义数字数组

let arr: number[] = [1, 2];

# 使用数组泛型定义数字数组

    let arr: Array<number> = [1, 2, 3]

# 数组元组定义

元组为解决数组只能定义单一类型
元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。

let x: [string, number];
x = ['Runoob', 1];    // 运行正常
x = [1, 'Runoob'];    // 报错
console.log(x[0]);    // 输出 Runoob

# 枚举

枚举从第一位定义的初始值中依次递增一

enum dietrom {
    id = 100,
    name,
    age
}

console.log('定义枚举', dietrom.id); //100
console.log('定义枚举', dietrom.name);//101
console.log('定义枚举', dietrom.age);//102

# 泛型

在定义函数或类时 如果遇到类型不明确就可以使用泛型
当我们定义一个变量不确定类型的时候有两种解决方式:

  1. 使用any 使用any定义时存在的问题:虽然知道传入值的类型但是无法获取函数返回值的类型;另外也失去了ts类型保护的优势
  2. 使用泛型 泛型指的是在定义函数/接口/类型时,不预先指定具体的类型,而是在使用的时候在指定类型限制的一种特性。

# 在函数中使用泛型

使用方式类似于函数传参,传什么数据类型,T就表示什么数据类型, 使用表示,T也可以换成任意字符串。

function fn<T>(name: T): T {
    console.log(name)
}

fn<string>("张三") //此时“T”表示sring类型
fn<string | number>(111)//此时“T”表示字符串或者数字类型

# 在接口中使用泛型

interface search {
    <T, Y>(name: T, age: Y): T
}

let fn: search = function <T, Y>(name: T, age: Y) {
    return name
}
fn('张三', 18)

# 在类中使用泛型

class amimal<T> {
    name: T;

    constructor(name: T) {
        this.name = name
    }

    say<T>(say: T) {
        console.log(say)
    }
}

let cat = new amimal('cat')
cat.say('喵喵')

# 使用接口约束泛型

上述所说泛型类型的定义取决于调用者使用的类型当然调用者使用任何类型都可以,这就需要约束泛型,泛型类型缩小
泛型类型缩小使用extends关键字

interface people {
    name: string;
    age: number
}

function fn<T extends people>(arg: T) {
    return arg
}

fn({name: '张三', age: 18})

# 定义any类型

任意值是 TypeScript 针对编程时类型不明确的变量使用的一种数据类型,它常用于以下三种情况。
类型为any时禁用所有类型检查

  1. 变量的值会动态改变时,比如来自用户的输入,任意值类型可以让这些变量跳过编译阶段的类型检查,示例代码如下:
   let x: any = 1;    // 数字类型
x = 'I am who I am';    // 字符串类型
x = false;    // 布尔类型
  1. 改写现有代码时,任意值允许在编译时可选择地包含或移除类型检查,示例代码如下:
let x: any = 4;
x.ifItExists();    // 正确,ifItExists方法在运行时可能存在,但这里并不会检查
x.toFixed();    // 正确
  1. 定义存储各种类型数据的数组时,示例代码如下:
let arrayList: any[] = [1, false, 'fine'];
arrayList[1] = 100;

# null类型

在 JavaScript 中 null 表示 "什么都没有"。
null是一个只有一个值的特殊类型。表示一个空对象引用。
用 typeof 检测 null 返回是 object。

# undefined类型

在 JavaScript 中, undefined 是一个没有设置值的变量。

typeof 一个没有值的变量会返回 undefined。

Null 和 Undefined 是其他任何类型(包括 void)的子类型,可以赋值给其它类型,如数字类型,此时,赋值后的类型会变成 null 或 undefined。而在TypeScript中启用严格的空校验(--strictNullChecks)特性,就可以使得null 和 undefined 只能被赋值给 void 或本身对应的类型,示例代码如下:

// 启用 --strictNullChecks
let x: number;
x = 1; // 编译正确
x = undefined;    // 编译错误
x = null;    // 编译错误

# never 类型

never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。这意味着声明为 never 类型的变量只能被 never 类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环),示例代码如下:

# 类型断言

当ts无法推断出当前类型或ts推断出的类型错误时,可以手动强制指定一个值的类型

# 使用<类型>值形式

var str: string = '我是字符串'
var str2: number = <number>str   //str、str2 是 string 类型

# 使用 值 as 类型

var str: string = '我是字符串'
var str2: number = str as number  //str、str2 是 string 类型

# 类型推断

当类型没有给出时,TypeScript 编译器利用类型推断来推断类型。
如果由于缺乏声明而不能推断出类型,那么它的类型被视作默认的动态 any 类型。

上次更新: 3/31/2023, 3:36:19 PM