参考文档:https://www.yuque.com/yuanlaishizijiaxiongdi/gpge7z/vdtiou#lvG9T

is

is操作符用于ts的类型谓词中,实现ts类型保护的一种方式。
例如下面代码

  1. function doSometing(value: string | number) {
  2. if (typeof value === 'string') {
  3. // TS 可以识别这个分支中 value 是 string 类型的参数(这就叫类型保护)
  4. // do something
  5. } else {
  6. // TS 可以识别这个分支中 value 是 number 类型的参数
  7. // do something
  8. }
  9. }

除去上面这种方式以外,还可以使用TS的类型谓词来实现

  1. /**
  2. * 此函数用于判断参数 value 是不是 string 类型
  3. *
  4. * 由于返回类型声明了类型谓词,可以帮助TS在代码分支中进行类型保护(默认返回 boolean 类型是没办法做到的)
  5. **/
  6. function isString(value: any): value is string {
  7. return typeof value === 'string';
  8. }
  9. function doSometing(value: string | number) {
  10. if (isString(value)) {
  11. // TS 可以识别这个分支中 value 是 string 类型的参数(这就叫类型保护)
  12. } else {
  13. // TS 可以识别这个分支中 value 是 number 类型的参数
  14. }
  15. }

相关练习:https://typescript-exercises.github.io/#exercise=4&file=%2Findex.ts

typeof

在 TS 中,typeof 可以获取一个变量的声明类型;(基本类型必须声明

  1. const num1: number = 10;
  2. const num2: typeof num1 = 10; // num2也是number类型
  3. const num1 = 10;
  4. const num2: typeof num1 = 100; // // Type '100' is not assignable to type '10'.

对于number string boolean 这些基本类型在没有声明而直接赋值的情况下,都会存在这个问题。但如果是对象类型就不会出现这个问题:

  1. const obj = { a: '1', b: 1, c: [1, '1'] };
  2. type Foo = typeof obj;
  3. //等价于 type Foo = { a: string, b: number, c: (number | string)[] }
  4. const obj1 = {
  5. a: '2',
  6. b: 2,
  7. c: [2,'2']
  8. }

keyof

获取对象接口的所有key值

  1. type Obj = { a: string; b: string }
  2. type Foo = keyof obj;
  3. // type Foo = 'a' | 'b';

in

遍历枚举类型

  1. type Keys = 'a' | 'b' | 'c';
  2. type Obj = {
  3. [ T in Keys]: string;
  4. }
  5. // in 遍历 Keys,并为每个值赋予 string 类型
  6. // type Obj = {
  7. // a: string,
  8. // b: string,
  9. // c: string
  10. // }

TS一些内置类型

Partial

功能是将类型的属性变成可选,注意这是浅Partial

  1. type Partial<T> = {
  2. [P in keyof T]?: T[P]
  3. };

for example

  1. interface UserInfo {
  2. id: string;
  3. name: string;
  4. }
  5. const xiaoming: UserInfo = {
  6. name: 'xiaoming'
  7. }
  8. // error:Property 'id' is missing in type '{ name: string; }' but required in type 'UserInfo'

使用Partial

  1. type NewUserInfo = Partial<UserInfo>;
  2. const xiaoming: NewUserInfo = {
  3. name: 'xiaoming'
  4. }

这个NewUserInfo就相当于

  1. interface NewUserInfo {
  2. id?: string;
  3. name?: string;
  4. }

但Partial有个局限性,就是只支持处理第一层的属性,如果有多层,需要自己声明一个type,如下所示

  1. type DeepPartial<T> = {
  2. // 如果是 object,则递归类型
  3. [U in keyof T]?: T[U] extends object
  4. ? DeepPartial<T[U]>
  5. : T[U]
  6. };
  7. interface UserInfo {
  8. id: string;
  9. name: string;
  10. fruits: {
  11. appleNumber: number;
  12. orangeNumber: number;
  13. }
  14. }
  15. type NewUserInfo = DeepPartial<UserInfo>;
  16. const xiaoming: NewUserInfo = {
  17. name: 'xiaoming',
  18. fruits: {
  19. orangeNumber: 1,
  20. }
  21. }