现在很多第三方库都改用ts来写了,如果遇到问题去看相关源码,看不懂人家那一堆都语法是啥意思,就尴尬了,所以还是先把TypeScript的语法过一遍,起码要能看懂人家的代码表达的一个大概意思。
基础类型
定义一个变量,都需要写成这种格式:let [变量: 类型] = 值;
和JS基本一样的是:
1 | let isDone: boolean = false; |
和JS相比比较不一样的:
元组 Tuple
元组类型允许表示一个已知元素数量和类型的数组,各元素的类型不必相同。
1
2
3
4
5let x: [string, number];
x = ['hello', 10] // OK
x = [10, 'hello']; // Error, Initialize it incorrectly
console.log(x[0].substr(1)); // OK
console.log(x[1].substr(1)); // Error, 'number' does not have 'substr'
枚举 enum
默认从0开始编号,也可以手动的指定成员的数值,作用是可以由枚举的值得到它的名字
1
2
3enum Color {Red = 1, Green = 4, Blue = 5}
let c: Color = Color.Green;
let colorName: string = Color[4]; // Green
Any
编程阶段还不清楚类型的变量指定一个类型
1
2
3let notSure: any = 4;
notSure = "maybe a string instead";
notSure = false; // okay, definitely a boolean
Void
void类型像是与any类型相反,它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void
1 | function warnUser(): void { |
类型断言
1 | let someValue: any = "this is a string"; |
对象的类型——接口
定义一个接口,然后用的时候和 [let 变量:类型 = 值] 是一个感觉;感觉接口是对非基础类型对一个称呼
1 | interface Person { |
可选属性
1 | interface SquareConfig { |
只读属性
1 | interface Point { |
额外的属性检查
如果 SquareConfig带有上面定义的类型的color和width属性,并且还会带有任意数量的其它属性,那么我们可以这样定义它:
1 | interface SquareConfig { |
函数类型
1 | interface SearchFunc { |
可索引的类型
定义了StringArray接口,它具有索引签名。 这个索引签名表示了当用 number去索引StringArray时会得到string类型的返回值。TypeScript支持两种索引签名:字符串和数字;
1 | interface StringArray { |
索引签名设置为只读,这样就防止了给索引赋值:
1 | interface ReadonlyStringArray { |
类类型
implements关键字, 当一个类实现了一个接口时,只对其实例部分进行类型检查。因为createClock的第一个参数是ClockConstructor类型,在createClock(AnalogClock, 7, 32)里,会检查AnalogClock是否符合构造函数签名。
1 | interface ClockConstructor { |
继承接口
支持多接口继承
1 | interface Shape { |
混合类型
1 | interface Counter { |
泛型
这一块就是我想看人家都源码,看不懂不得已放弃研究的地方。
identity函数叫做泛型,因为它可以适用于多个类型。不同于使用Any,会丢失传入和返回的类型关联。
从代码中理解意思:
1 | function identity<T>(arg: T): T { |
类型变量T会帮助我我们捕获传入的类型,例如,传入的是number还是string,之后返回T,这样传入的值和返回的值就是一样了。
1 | #### 使用泛型变量 |
理解:泛型函数loggingIdentity,接收类型参数T和参数arg,它是个元素类型是T的数组,并返回元素类型是T的数组。 如果我们传入数字数组,将返回一个数字数组,因为此时 T的的类型为number。 这可以让我们把泛型变量T当做类型的一部分使用,而不是整个类型,增加了灵活性。
泛型类型
1 | interface GenericIdentityFn { |
泛型类
泛型类使用( <>)括起泛型类型,跟在类名后面。
类的所有属性都在使用相同的类型,没有什么去限制它,如下只能使用number类:
1 | class GenericNumber<T> { |