如何进行类型约束
仅需在变量、函数的参数、返回值位置加上:类型
ts 在很多场景中可以完成类型推导
any:表示任意类型,对该类型,ts 不进行类型检查
let num: number;
let name: string = "zl";
// function add(a: number, b: number): number {
// return a + b;
// }
function add(a: number, b: number) {
return a + b;
}
// 自动推导
num = add(2, 3);
源代码和编译结果的差异:只是少了类型约束
编译结果中不会有类型约束,也再一次验证了运行过程中是不会有 ts 代码的
ts 代码是静态的:当 ts 代码中有错误的时候,是不会通过编译的。
基本类型
- number: 数字
- string:字符串
- boolean:布尔
- 数组
- object:对象
- null 和 undefined
null 和 undefined 是所有其它类型的子类型,它们可以赋值给其它类型。
约束为数组类型时,必须指定数组的类型,否则会变成字面量类型。
// 数组
let nums: number[] = [1, 2, 3];
let numa: Array<number> = [1, 2, 3];
// 对象
let obj: object = {
age: 13,
name: "zl"
}
let n: string = undefined;
let b: number = null;
null 和 undefined 的可以任意赋值,会造成代码紊乱,可以通过配置中更严格的空类型检查"strictNullChecks": true
解决,这样 null 和 undefined 就只能赋值给自身了。
其它常用类型
- 联合类型
- void 类型
- never 类型
- 字面量类型
- 元祖类型(Tuple)
- any 类型
联合类型
多种类型任选其一
当一个变量值会有多种类型可能的时候,可以使用联合类型,但此时使用变量时的智能提示会消失,因为此时 ts 并不能知道该作哪种类型下的提示。
配合类型保护进行判断
类型保护:当对某个变量进行类型判断之后,在判断的语句块中便可以确定它的确切类型,typeof 可以做关于基本类型的类型保护。
// 联合类型
let abj: string | undefined;
// 类型保护
if(typeof abj === "string") {
}
void
通常用于约束函数的返回值,表示该函数没有任何返回。
function active(): void {
console.log("Hello world");
}
never
通常用于约束函数的返回值,表示该函数永远不可能结束。
function neverStop(): never {
while(true) {
// ...
}
}
字面量
使用一个值进行约束,可以约束对象
// a 的取值只能是字符串A
let a: "A";
// 联合类型 + 字面量类型
let gender: "男" | "女";
// arr 永远只能取值为一个空数组
// 注意:这不是在定义一个数组类型,数组类型一定要加上类型
let arr: [];
// user 对象只能有且一定要有 name 和 age 两个属性,且属性类型固定
let user: {
name: string,
age: number
}
user = {
name: "zl",
age: 14
}
元祖
一个固定长度的数组,并且数组中的每一项的类型确定
let tu: [number, string];
// 那 tu 只能是包含一个数字和一个字符串的数组
tu = [12, "12"];
any
any 类型可以绕过类型检查,因此,any 类型的数据可以赋值给任意类型
let aa: any = "adf";
let bb: number = aa;
类型别名
对已知的一些类型定义名称,定义方式:type 类型名 = ...
函数的相关约束
函数重载
在函数实现之前,对函数调用的多种情况进行声明。
// 函数重载
// 函数调用只能传同为 number 或同为 string
function combina(a: number, b: number): number;
function combina(a: string, b: string): string;
function combina(a: number | string, b: number | string): number | string {
if(typeof a === "number" && typeof b === "number") {
return a * b;
}else if(typeof a === "string" && typeof b === "string") {
return a + b;
}
throw new Error();
}
combina(1, 1);
可选参数
可以在某些参数名后加上问号,表示该参数可以不用传递,此时该参数类型会变成 原类型 | undefined
,可选参数必须在参数列表的末尾。