TypeScript 2.9

keyof 现在包括 stringnumbersymbol 键名

TypeScript 2.9 将索引类型泛化为包括 numbersymbol 命名属性。以前,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 中也是一个错误。

strictNullChecks 中,无类型约束参数不再分配给 object

以下代码是自24013起在 strickNullChecks 下出现的编译器错误:

function f<T>(x: T) {
  const y: object | null | undefined = x;
}

它可以用任意类型(例如,stringnumber )来实现,因此允许它是不正确的。 如果您遇到此问题,请将您的类型参数约束为 object 以仅允许对象类型。如果想允许任何类型,使用 {} 进行比较而不是 object

参考