javascript - 为什么 `keyof any` 在 typescript 中的类型为 `string | number | symbol`?

标签 javascript typescript

类型Record在typescript中定义为:

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

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

检查后发现keyof any的类型是string |编号 |符号。这是为什么?

最佳答案

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 必须是对于一个对象。

关于javascript - 为什么 `keyof any` 在 typescript 中的类型为 `string | number | symbol`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55535598/

相关文章:

javascript - 用 JavaScript 按类替换内容

typescript - 为什么使用cordova google-plus插件会弹出 "Confirm your choices"两次?

html - 我怎样才能有嵌套的 mat-table sortables?

javascript - 查找mongo文档中数组的最后一项并检查其字段是否为某个值

javascript - true 和 falsey 值作为 useState 的初始值未正确反射(reflect)

javascript - 更改 MarionetteJS 中的 "page"

javascript - jqgrid自定义删除对话框消息

typescript - 缓存构造函数导致 "Property ' .. .' has no initializer and is not definitely assigned in the constructor."

javascript - Angular 7 使用 *ngfor 分组数据

javascript - Typescript 模块,需要外部 node_modules