有这几种类型
Boolean
const flag: boolean = false
Number
const flag: number = 1
String
const flag: string = 'string'
Array
const flag: number[] = [1, 2, 3]const flag: Array<number> = [1, 2, 3] // 泛型语法
Array 是 ts 定义好的泛型。
typescript 是通过tsconfig lib 来决定读取的是 lib 文件夹下的哪一部分的头文件。
以及 target 如果设置是 es5 的,那么使用 es6 的语法就报错
元组 Tuple
const flag: [string, number] = ['a', 1]flag[3] = 'world'; // OK, 字符串可以赋值给(string | number)类型console.log(flag[5].toString()); // OK, 'string' 和 'number' 都有 toStringflag[6] = true; // Error, 布尔不是(string | number)类型
TODO: 如何使用 数组泛型形式做元组
我想做一个长度为100 的字符串元组,字符串和数字 交叉的元组怎么写
简单的写法可以是这样,github 的 ts issue 里面有人提供了更加健壮的写法
interface FixedLengthArray<T extends any, L extends number> extends Array<T> {"0": T;length: L;}
https://github.com/microsoft/TypeScript/issues/26223
TODO: 字符串和数字 交叉的100个数量的元组怎么写 ?
Enum
enum Flag {bad, // 0good, // 1}// 结果"use strict";var Flag;(function (Flag) {Flag[Flag["bad"] = 0] = "bad";Flag[Flag["good"] = 1] = "good";})(Flag || (Flag = {}));enum Flag {bad = "BAD",good = "GOOD"}// 结果"use strict";var Flag;(function (Flag) {Flag["bad"] = "BAD";Flag["good"] = "GOOD";})(Flag || (Flag = {}));enum Flag {bad = "BAD",good = 1// 结果"use strict";var Flag;(function (Flag) {Flag["bad"] = "BAD";Flag[Flag["good"] = 1] = "good";})(Flag || (Flag = {}));
通过观察上述生成的 ES5 代码,我们可以发现数字枚举相对字符串枚举多了 “反向映射”:
console.log(Enum.A) //输出:0console.log(Enum[0]) // 输出:A
TODO: 枚举为什么不支持 布尔值, undefined null 等
- 是否使用字符串联合类型代替枚举类型更合适 (‘good’ | ‘medium’ | ‘bad’)
定义的枚举,在经过编译器编译后是一个对象。。但有时定义枚举可能只是为了让程序可读性更好,而不需要编译后的代码,即不需要编译成对象。typescript中考虑到这种情况,所以加入了 const enum (完全嵌入的枚举)
enum Status{Off,On}const enum Animal{Dog,Cat}const status = Status.Onconst animal = Animal.Dog// 编译后 animal 并没有被创建var Status;(function (Status) {Status[Status["Off"] = 0] = "Off";Status[Status["On"] = 1] = "On";})(Status || (Status = {}));var status = Status.On;var animal = 0 /* Dog */;
Any
在 TypeScript 中,任何类型都可以被归为 any 类型。这让 any 类型成为了类型系统的顶级类型(也被称作全局超级类型)。
TODO: 有哪些顶级类型,为什么叫顶级类型any,number,string,boolean,void,enum,null,undefined,never,unknown,这些顶级类型也就是基础类型,ts 内部底层做的定义,无法通过编译器再进一步点击去看。
https://en.wikipedia.org/wiki/Bottom_type https://en.wikipedia.org/wiki/Top_type
Unknown
和 any 一样是顶级类型
let flag: unknown;flag = "Hello World"; // OKflag = true; // OKflag = 1; // OK// flag 告诉 ts 不知道它是什么类型,所以赋值给他任何类型都可以,也就是所有的赋值都可以
let flag: unknown;let flag1: unknown = value; // OKlet flag2: any = value; // OKlet flag3: boolean = value; // Errorlet flag4: number = value; // Error// unknown 类型赋值给 uknown 和any类型可以,但是想赋值给其他类型的不可以。// 因为unknown 类型可以被赋值其他任何类型
let flag: unknown;flag.foo.bar; // Errorflag.trim(); // Errorflag(); // Error// 同样的,ts 也不知道是否有这些属性和方法,所以不能这么操作。
TODO: 和 any 不同,是处于什么目的被设计出来的
Void
void类型像是与any类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void:
function warnUser(): void {console.log("This is my warning message");}
声明一个void类型的变量没有什么大用,因为你只能为它赋予undefined和null:
let unusable: void = undefined;
Null Undefined
TypeScript里,undefined和null两者各自有自己的类型分别叫做undefined和null。 和 void相似,它们的本身的类型用处不是很大:
// Not much else we can assign to these variables!let u: undefined = undefined;let n: null = null;
默认情况下null和undefined是所有类型的子类型。 就是说你可以把 null和undefined赋值给number类型的变量。
然而,当你指定了--strictNullChecks标记,null和undefined只能赋值给void和它们各自。 这能避免 很多常见的问题。 也许在某处你想传入一个 string或null或undefined,你可以使用联合类型string | null | undefined。 再次说明,稍后我们会介绍联合类型。
注意:我们鼓励尽可能地使用
--strictNullChecks,但在本手册里我们假设这个标记是关闭的。
Never
never 类型表示的是那些永不存在的值的类型。 例如,never 类型是那些总是会抛出异常或根本就不会有返回值的函数表达式或箭头函数表达式的返回值类型。
// 返回never的函数必须存在无法达到的终点function error(message: string): never {throw new Error(message);}function infiniteLoop(): never {while (true) {}}
TODO: 补充下 never 实际应用
