为什么`keyof any`具有`string |类型?编号打字稿中的符号`?

时间:2019-04-05 12:38:35

标签: javascript typescript

打字稿中的类型Record定义为:

type Record<K extends keyof any, T> = {
    [P in K]: T;
}

我不明白为什么在这里使用keyof any

检查后,我发现keyof any的类型为string | number | symbol。为什么会这样?

1 个答案:

答案 0 :(得分:3)

keyof any表示可以用作对象索引的任何值的类型。当前,您可以使用stringnumbersymbol来索引一个对象。

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必须是对对象有效的键。