TypeScript 2.9 将索引类型泛化为包括 number
和 symbol
命名属性。以前,keyof
运算符和映射类型仅支持 string
命名属性。
function useKey<T, K extends keyof T>(o: T, k: K) {
var name: string = k; // 错误: keyof T 不能分配给 `string`
}
-
如果你的函数只能处理名字符串属性的键,请在声明中使用
Extract<keyof T,string>
:function useKey<T, K extends Extract<keyof T, string>>(o: T, k: K) { var name: string = k; // OK }
-
如果你的函数可以处理所有属性键,那么更改应该是顺畅的:
function useKey<T, K extends keyof T>(o: T, k: K) { var name: string | number | symbol = k; }
-
除此之外,还可以使用
--keyofStringsOnly
编译器选项禁用新行为。
以下代码是一个自 #22262 开始的编译器错误:
function f(
a: number,
...b: number[], // 违规的尾随逗号
) {}
剩余参数上的尾随逗号不是有效的 JavaScript,并且,这个语法现在在 TypeScript 中也是一个错误。
以下代码是自24013起在 strickNullChecks
下出现的编译器错误:
function f<T>(x: T) {
const y: object | null | undefined = x;
}
它可以用任意类型(例如,string
或 number
)来实现,因此允许它是不正确的。 如果您遇到此问题,请将您的类型参数约束为 object
以仅允许对象类型。如果想允许任何类型,使用 {}
进行比较而不是 object
。