打字稿中的类型Record
定义为:
type Record<K extends keyof any, T> = {
[P in K]: T;
}
我不明白为什么在这里使用keyof any
。
检查后,我发现keyof any
的类型为string | number | symbol
。为什么会这样?
答案 0 :(得分:3)
keyof any
表示可以用作对象索引的任何值的类型。当前,您可以使用string
或number
或symbol
来索引一个对象。
let a: any;
a['a'] //ok
a[0] // ok
a[Symbol()] //ok
a[{}] // error
在Record
类型中,此K extends keyof any
用于将K
约束为某个对象的有效键。因此K
可以是'prop'
或'1'
或string
,但不能是{a : string}
:
type t0 = Record<1, string> // { 1: string }
type t1 = Record<"prop", string> // { prop: string }
type t3 = Record<string, string> // { [name: string]: string }
type t4 = Record<number, string> // { [name: number]: string }
type t5 = Record<{a : string}, string> // error
存在约束,因为K
中传递的任何类型都将成为结果类型的键,因此K
必须是对对象有效的键。