数据类型
布尔型boolean
let isDone: boolean = false;
数值number
TypeScript里的所有数字都是浮点数。
let decLiteral: number = 6;
let hexLiteral: number = 0xf00d;//十六进制
let binaryLiteral: number = 0b1010;//二进制
let octalLiteral: number = 0o744;//八进制
字符串string
使用双引号( ")或单引号(')表示字符串。
使用模版字符串,它可以定义多行文本和内嵌表达式。 这种字符串是被反引号包围('),并且以${ expr }这种形式嵌入表达式。
let name: string = `Gene`;
let sentence: string = `Hello, my name is ${ name }.
空值void
用于标识方法返回值的类型,表示该方法没有返回值。
function hello(): void {
alert("Hello Runoob");
}
任意值any
允许被赋值为任意类型。
let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
数组array
可以在元素类型后面接上 [],表示由此类型元素组成的一个数组:
let list: number[] = [1, 2, 3];
使用数组泛型,,Array<元素类型>:
let list: Array<number> = [1, 2, 3];
接口也可以用来描述数组:
interface NumberArray {
[index: number]: number;
}
let fibonacci: NumberArray = [1, 1, 2, 3, 5];
元组tuple
元组类型用来表示已知元素数量和类型的数组,各元素的类型不必相同,对应位置的类型需要相同。
let x: [string, number];
x = ['Runoob', 1]; // 运行正常
x = [1, 'Runoob']; // 报错
console.log(x[0]); // 输出 Runoob
枚举enum
枚举类型用于定义数值集合。常用于取值被限定在一定范围内的场景,比如一周只能有七天,颜色限定为红绿蓝等。
enum Days {Sun, Mon, Tue, Wed, Thu, Fri, Sat};
console.log(Days["Sun"] === 0); // true
console.log(Days["Mon"] === 1); // true
console.log(Days["Tue"] === 2); // true
console.log(Days["Sat"] === 6); // true
console.log(Days[0] === "Sun"); // true
console.log(Days[1] === "Mon"); // true
console.log(Days[2] === "Tue"); // true
console.log(Days[6] === "Sat"); // true
枚举成员会被赋值为从 0 开始递增的数字,同时也会对枚举值到枚举名进行反向映射。
枚举项可以手动赋值。未手动赋值的枚举项会接着上一个枚举项递增。
如果某个属性的值是计算出来的,那么它后面一位的成员必须要初始化值。
const getValue = () => {
return 0
}
enum List {
A = getValue(),
B = 2, // 此处必须要初始化值,不然编译不通过
C
}
console.log(List.A) // 0
console.log(List.B) // 2
console.log(List.C) // 3
null和undefined
null表示对象值缺失,undefined用于初始化变量为一个未定义的值。
undefined 和 null 是所有类型的子类型。
never
never 是其它类型(包括 null 和 undefined)的子类型,代表从不会出现的值。这意味着声明为 never 类型的变量只能被 never类型所赋值,在函数中它通常表现为抛出异常或无法执行到终止点(例如无限循环)。
// 返回值为 never 的函数可以是抛出异常的情况
function error(message: string): never {
throw new Error(message);
}
// 返回值为 never 的函数可以是无法被执行到的终止点的情况
function loop(): never {
while (true) {}
}
object
object表示非原始类型,也就是除number,string,boolean,symbol,null或undefined之外的类型。
使用object类型,就可以更好的表示像Object.create这样的API。
declare function create(o: object | null): void;
create({ prop: 0 }); // OK
create(null); // OK
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error
类型推论
在初始化变量和成员,设置默认参数值和决定函数返回值时,类型推论会帮助提供类型。
let myFavoriteNumber = 'seven';
myFavoriteNumber = 7;
// index.ts(2,1): error TS2322: Type 'number' is not assignable to type 'string'.
如果定义的时候没有赋值,不管之后有没有赋值,都会被推断成 any 类型而完全不被类型检查。
let myFavoriteNumber;
myFavoriteNumber = 'seven';//true
myFavoriteNumber = 7;//true
联合类型
联合类型(Union Types)表示取值可以为多种类型中的一种。联合类型使用 | 分隔每个类型。
let myFavoriteNumber: string | number;
myFavoriteNumber = 'seven';//true
myFavoriteNumber = 7;//true
当 TypeScript 不确定一个联合类型的变量到底是哪个类型的时候,我们只能访问此联合类型的所有类型里共有的属性或方法。
类型断言
类型断言可以用来指定一个值的类型,即允许变量从一种类型更改为另一种类型。
语法格式
//<类型>值
let someValue: any = "this is a string";
let strLength: number = (<string>someValue).length;
或:
//值 as 类型
let someValue: any = "this is a string";
let strLength: number = (someValue as string).length;
在 tsx 语法(React 的 jsx 语法的 ts 版)中必须使用后者,即 值 as 类型。
形如 <Foo> 的语法在 tsx 中表示的是一个 ReactNode,在 ts 中除了表示类型断言之外,也可能是表示一个泛型。
用途总结
- 联合类型可以被断言成其中一个类型(类型断言不是类型转换,断言成一个联合类型中不存在的类型是不允许的。类型断言只能够「欺骗」TypeScript 编译器,无法避免运行时的错误,反而滥用类型断言可能会导致运行时错误)
- 父类可以断言成子类(实际运用中使用
instanceof更加合适)
class ApiError extends Error {
code: number = 0;
}
class HttpError extends Error {
statusCode: number = 200;
}
function isApiError(error: Error) {
if (typeof (error as ApiError).code === 'number') {
return true;
}
return false;
}
//上下两者等价实现
function isApiError(error: Error) {
if (error instanceof ApiError) {
return true;
}
return false;
}
- 任何类型可以断言成any(一方面不能滥用
as any,另一方面也不要完全否定它的作用,我们需要在类型的严格性和开发的便利性之间掌握平衡(这也是 TypeScript 的设计理念之一),才能发挥出 TypeScript 最大的价值。) - any 可以断言成任何类型