let isDone: boolean = false; let createdByBoolean: boolean = Boolean(1); let createdBynewBoolean: boolean = newBoolean(1); // Type 'Boolean' is not assignable to type 'boolean'
数值
使用 number 来定义数值类型。
1 2 3 4 5 6
let decLiteral: number = 6; let hexLiteral: number = 0xf00d; // ES6 中的二进制表示法,会被编译为十进制数字。 let binaryLinteral: number = 0b1010; // ES6 中的八进制表示法,会被编译为十进制数字。 let octalLiteral: number = 0o744; let notANumber: number = NaN; let infinityNumber: number = Infinity;
字符串
使用 string 来定义字符串类型。
1 2 3 4 5
let myName: string = "Tom"; let myAge: number = 25; let sentence: string = `Hello, I am ${myName}.I will be ${ myAge + 1 } years old tomorrow.`;
空值
JS 中没有空值(Void)的概念,在 TS 中可用 void 表示没有任何返回值的函数。
1 2 3 4
functionalertName(): void{ alert("Now is alerting!"); } let unusable: void = undefined;
Null和Undefined
使用 null 和 undefined 来定义这两个类型。
void、null 和 undefined, 这三个类型的变量,都不能赋值给其他类型的变量。
1 2 3 4 5 6 7
let u: undefined = undefined; let n: null = null; let v: void; let num: number = undefined; let num1: number = u; // Type 'undefined' is not assignable to type 'number' let num2: number = n; // Type 'null' is not assignable to type 'number' let num4: number = v; // Type 'void' is not assignable to type 'number'
任意值
任意值用来表示允许赋值为任意类型。
什么是任意值类型
如果是普通类型,在赋值过程中改变类型是不被允许的。如果是 any 类型,则允许被赋值为任意类型。
1 2 3 4
let myNum1: string = "seven"; let myNum2: any = "seven"; myNum1 = 7; // error TS2322: Type 'number' is not assignable to type 'string' myNum2 = 7;
任意值的属性和方法
在任意值上访问任何属性和调用任何方法但是允许的。
可以认为,声明一个变量为任意值之后,对它的任何操作,返回的内容的类型都是任意值。
1 2 3 4 5 6
let anyThing: any = "hello"; console.log(anyThing.myName); // undefined console.log(anyThing.myName.firstName); // Uncaught TypeError: Cannot read properties of undefined (reading 'firstName') anyThing.setName("Jerry"); anyThing.setName("Jerry").sayHello(); anyThing.myName.setFirstName("Tom");
未声明类型的变量
如果在声明变量时未指定其类型,则它会被识别为任意类型。
1 2 3 4
let something; something = "seven"; something = 7; something.setName("Tom");
类型推论
如果没有明确的指定类型,那么 TS 会按照类型推论的规则推断出一个类型。
什么是类型推论
TS 会在没有明确的指定类型的时候推测出一个类型,这就是类型推论。
如果定义时没有赋值,不管之后有无赋值,该变量都会被推断为 any 类型而不被类型检查。
1 2 3 4 5 6 7
let favoriteNum1 = "seven"; let favoriteNum2: string = "seven"; // 这两个赋值是等价的 let favoriteNum; favoriteNum1 = 7; // error TS2322: Type 'number' is not assignable to type 'string' favoriteNum2 = 7; // error TS2322: Type 'number' is not assignable to type 'string' favoriteNum = "seven"; // 没问题 favoriteNum = 7; // 没问题
联合类型
联合类型表示取值可以为多种类型中的一种。
简单的例子
联合类型使用 | 分隔每个类型。
下面的 let myFavoriteNumber: string | number 的含义是,允许 myFavoriteNumber 的类型是 string 或者 number,但是不能是其他类型。
1 2 3 4 5 6
let myFavoriteNumber: string | number; myFavoriteNumber = "seven"; myFavoriteNumber = 7; myFavoriteNumber = true; // error TS2322: Type 'boolean' is not assignable to type 'string | number'. // Type 'boolean' is not assignable to type 'number'.
functiongetLength(something: string | number): number{ return something.length; } // error TS2339: Property 'length' does not exist on type 'string | number' // Property 'length' does not exist on type 'number'
联合类型的变量在被赋值的时候,会根据类型推论的规则推断出一个类型。
1 2 3 4 5
let myFavoriteNumber: string | number; myFavoriteNumber = "seven"; console.log(myFavoriteNumber.length); // 5 myFavoriteNumber = 7; console.log(myFavoriteNumber.length); // error TS2339: Property 'length' does not exist on type 'number'
let sum2 = function (x: number, y: number): number{ return x + y; }; let sum3: (x: number, y: number) =>number = function ( x: number, y: number ): number{ return x + y; };