复杂基础类型
1.array(数组):简单来说就是存一组数字。
数组有两种定义方式分别是直接定义和数组泛型。
直接定义:使用数据类型[]即可,如number[],推荐使用这种写法。
数组泛型:使用Array<数组类型>定义数组,但这种写法会与JSX语法冲突,不推荐这种写法。
let list1: number[] = [1, 2, 3];//直接定义
let list2: Array<number> = [1, 2, 3];//数组泛型
2.object:object是引用类型,他存储的是值的引用,当想让一个变量或函数的参数是一个对象时,可以使用这个类型。(关于对象和引用类型将会在下一篇文章中讲解)
let obj: object
obj = { name: 'TypeScript' }
obj = 123 // 错误 不能将类型“123”分配给类型“object”
console.log(obj.name) // 错误 类型“object”上不存在属性“name”
对象类型更适合以下场景
function getKeys (obj: object) {
return Object.keys(obj) // 会以列表的形式返回obj中的值
}
getKeys({ a: 'a' }) // ['a']
getKeys(123) // error 类型“123”的参数不能赋给类型“object”的参数
3.元组:元组可以看作是数组的拓展,它可以存储元素数量已知,同时每个元素的类型也已知的一组数据
let arr: [string, number, boolean];
arr = ["a", 2, false]; // success
arr = [2, "a", false]; // error 不能将类型“number”分配给类型“string”。不能将类型“string”分配给类型“number”。
arr = ["a", 2]; // error Property '2' is missing in type '[string, number]' but required in type '[string, number, boolean]'
arr[1] = 996
以上代码可以看到给元组赋值的时候既不能少也不能多,同时每个位置上的数据的数据类型也要匹配
4.枚举:枚举类似于选择题,规定了选择的范围,如一周七天,一年四季等都适合用枚举存储,
enum Season {
Spring = "春",
Summer = "夏",
Autumn = "秋",
Winter = "冬"
}
const season = Season.Spring;
console.log(season); // 春
console.log(Season.Summer) // 夏
console.log(Season.Monday) //错误,Season中不存在Monday
以上代码可以看出只能选择枚举类中有的属性,选择没有的属性编译时就会报错
5.any:any可以赋值任意类型,一般在不知道变量会使用什么类型时使用,但一定要少用
let value: any;
value = 123;
value = "abc";
value = false;
const array: any[] = [1, "a", true];
以上代码可以看出any可以存储任意类型的数据,any类型的数组也可以存储任意类型的数据。
6.void:void和any刚好相反,any是什么类型都能往里装,void则是除了undefined 和 null什么都不能往里装。一般用在定义了一个函数但不需要返回任何值的时候时候使用。
const consoleText = (text: string): void => {
console.log(text);
};
7.never:never是指永远不存在的值,一般用在抛出异常的时候,抛出异常之后程序就会停止运行,停止运行之后也就永远不会有任何的值会返回。由于never是所有类型的子类型,同时never没有任何子类型所以never除了本身以外不能被赋予任何类型,因此如果想把某个属性设置为只读,可以给该属性设置为never类型。
const props: {
id: number,
name?: never
} = {
id: 1
}
props.name = null; // error
props.name = 'str'; // error
props.name = 1; // error
给name赋值任何属性都会报错,在一定程度上name属性便成为了只读属性
8.unknown:unknown和any的作用类似,但unknown更安全。在遇到不确定使用什么类型的值的时候,尽量使用unknown。
在使用nuknown时需要注意的几个点:
unknown 不可以赋值给其它类型,只能赋值给 unknown 和 any 类型:
let value2: unknown;
let value3: string = value2; // error 不能将类型“unknown”分配给类型“string”
unknown 类型的值不能进行任何操作:
let value4: unknown;
value4 += 1; // error 对象的类型为 "unknown"
只能对 unknown 进行等或不等操作,不能进行其它操作:
value1 === value2;
value1 !== value2;
value1 += value2; // error
unknown 类型的值不能访问其属性、作为函数调用和作为类创建实例:
let value5: unknown;
value5.age; // error
value5(); // error
new value5(); // error
以上为复杂基础类型,希望各位大佬指正文章中出现的错误和缺少的细节