Typescript

keyof作用于interface(接口),产生一个联合类型,内容由interface中的所有的key组成。

1
2
3
4
5
6
interface Person {
	name: string;
	age: number;
}

type T = keyof Person; // 'name' |  'age'

in用来遍历枚举类型:

1
2
3
4
type Keys = "a" | "b"
type Obj =  {
  [p in Keys]: any
} // -> { a: any, b: any }

知道这两个关键字(keyword)后,便可以看懂Partial的源码了:

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

可以看出来,首先用keyof 来获取到T的所有keys,然后用in 来遍历这些keys,然后我们在这些key后面加了一个问号?,表示这个属性为可选属性(optional property),而T[P]则是获取到在T中定义的P属性的属性值的类型,这样,我们知道了,Partial把接口(interface)的所有属性变为可选。

1
2
3
4
5
6
interface Person {
	name: string;
	age: number;
}

type T = Partial<Person>; // -> {name?: string; age?: number}

Required的作用是让接口(interface)中的所有属性变为必选属性:

1
type Required<T> = { [P in keyof T]-?: T[P]}

精髓在于那个-?,我觉得可以理解为,把所有的问号都减去了,自然就成了必选属性了。


接口(interface)可以用来描述函数:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
interface IMyFn {
  (name: string, counts: number): string;
}

let myFn: IMyFn;

myFn = function(name: string, count: number): string {
  return `${name}一共跌倒过${count}次!`;
}

定义函数参数时没必要与IMyFn的参数名称一致,比如在第7行我们不一定要用name这个参数名称,可以用myName。以及一旦我们把IMyFn赋值给myFn以后,我们可以不用再显式定义函数类型,Typescript可以分析出来。

updatedupdated2020-09-072020-09-07