0%

keyof

keyof

对一个对象使用keyof操作符,会返回该对象属性名组成的一个字符串或者数字字面量的联合

如果这个类型有一个string或者number的类型的索引签名,keyof直接返回这些类型

1
2
3
4
5
6
type Arrayish={[n:number]:unknown};
type A=keypf Arrayish;
//type A=number
type Mapish={[k:string]:boolean};
type M=keyof Mapish;
//type M=string |number

M是stirng|number,这是因为JavaScript对象的属性名会被强制转换为一个字符串,所以obj[0]和obj[“0”]是一样的

数字字面量联合类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const NumericObject ={
[1]:"1";
[2]:"2";
[3]:"3";

}
type result=keyof typeof NumericObject;
// typeof NumbericObject 的结果为:
// {
// 1: string;
// 2: string;
// 3: string;
// }
// 所以最终的结果为:
// type result = 1 | 2 | 3

注意:

下面例子会报错

1
2
3
4
function useKey<T,K extends keyof T>(o:T,k:K){
var name:string=k;
//Type 'string|number|symbol' is not assignable to type 'stirng'
}

如果确定只使用字符串类型的属性名,

1
2
3
function useKey<T,K extends Extract<keyof T,string>>(o:T,k:K){
var name:string=k;//OK
}

如果要处理所有属性名:

1
2
3
function useKey<T,K extends keyof T>(o:T,k:K){
var name:string | number |symbol=k;
}