TypeScript中一些特殊类型

对于我当前所在team来说,TS几乎已是JS项目标配,估计其他厂也类似。原因很简单,就是类型检测可以为项目保驾护航,同时也TS类型声明本身充当了一部分文档的作用。

不知不觉,使用TS也好多年头,但是有些类型并不常用,必须承认原因就是没懂。因此,这里根据实践和学习,Mark下。

never

关于never需要有几点认识

  1. never是底部类型
  2. 常用于逻辑分支判断,确保新增的逻辑不会被遗忘
  3. void 表示返回为空,即返回undefined,没有任何类型,never 表示永远不存在的值的类型,永不返回。

使用场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
interface Circle {
kind: 'circle';
radius: number;
}

interface Square {
kind: 'square';
sideLength: number;
}

interface Triangle {
kind: 'triangle';
sideLength: number;
}

type Shape = Circle | Square;

function getArea(shape: Shape) {
switch (shape.kind) {
case 'circle':
return Math.PI * shape.radius ** 2;
case 'square':
return shape.sideLength ** 2;
default:
// 永远不可能
const _exhaustiveCheck: never = shape;
return _exhaustiveCheck;
}
}

如上,比如Switch中,穷举了所有情况,default为不存在的情况,如果有一天,外围的逻辑增加了Triangle类型,则这里编译即会报错

相关文章

ArrayLike,PromiseLike

TS中关于JS的环境声明下有这样几个like类型。比如ArrayLike,那么与Array类型有什么区别呢

lib/lib.es5.d.ts

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
interface ArrayLike<T> {
readonly length: number;
readonly [n: number]: T;
}


interface Array<T> {
/**
* Gets or sets the length of the array. This is a number one higher than the highest index in the array.
*/
length: number;
/**
* Returns a string representation of an array.
*/
toString(): string;
pop(): T | undefined;

...
}

如上定义可以看出ArrayLike只有两个属性,而Array有很多方法,比如pop。

使用场景

1
2
3
4
5
6
7
8
9
function getSize(arr: ArrayLike<any>): number {
return arr.length;
}

console.log(getSize([1, 2, 3])); // works

function fn() {
console.log(getSize(arguments)); // error
}

如上,如果我们将getSize的参数类型限制为array,则fn函数即会报错,因为arguments并非数组。因此ArrayLike面向于类似上述的情况。

相关文章

写在最后

吐槽下,如果说只是会写个interface,pick,omit,联合类型等都不用的话,其实TS的价值就很低,也不要说自己会TS。