`keyof any` 是什么意思?

5
据我所知,对于任何类型 T,keyof T 都将是 T 的公共属性名称,然后我看到了 keyof any,这让我感到困惑。我能否简化 keyof anyany

2
任何类型的键(key)都是任意类型(any)的子集,即键只能是字符串、数字、符号等。 - ABOS
考虑使用 PropertyKey 而不是 keyof any。 - captain-yossarian from Ukraine
1个回答

5
类型 keyof any 不是 any。它是 string | number | symbol
type PropKey = keyof any
// type PropKey = string | number | symbol

keyof类型运算符的结果是该类型允许使用的所有键类型的联合。因此,keyof any要求所有可能的键类型,因为any类型允许您使用任何有效的键进行索引。但并非所有类型都是有效的键,因此keyof any只是string | number | symbol,而不是unknown类型之类的东西:

declare const x: any;
x.str; // okay
x[123]; // okay
x[Symbol("")] // okay
x[new Date()] // error
x[false] // error

一个等价于keyof any的类型是在TypeScript标准声明文件中提供的PropertyKey类型:(链接)
declare type PropertyKey = string | number | symbol;

一般来说,如果你只关心支持最近的 TypeScript 版本,你可能会使用 PropertyKey 而不是 keyof any
你之前可能看到 keyof any 的原因是,在 TypeScript 2.9 之前,keyof 操作符只会返回可分配给 string 的类型。从 TypeScript 2.9 开始,keyof 支持 numbersymbol 键类型。而 PropertyKey 本身也是在 TypeScript 2.9 中引入的。

这意味着,如果你有任何需要同时支持 TypeScript 2.9 之前和之后版本的代码,你不能使用 PropertyKeystring | number | symbol 来适当地 约束键类型。但是你可以使用 keyof any;在 TypeScript 2.8 及以下版本中,keyof any 返回值仅为 string,而在此之后它返回 string | number | symbol。因此,你可以编写类似于下面这样的代码:

type DateHolder<K extends keyof any> = { [P in K]: Date };

它将在两种情况下工作。不过,自TypeScript 2.8以来已经过了一段时间,并且自那时以来发生了许多重大变化,因此可能没有必要使用keyof any

代码的游乐场链接


我现在明白了,谢谢! - Vespaiach

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接