试图了解Typescript泛型

时间:2019-07-10 21:54:04

标签: typescript generics

我具有以下功能:

interface ExtraModels extends Model {
  unknown: string
}

const write = async (data: ExtraModels[]) => {
  console.log(data[0].unknown)
}

正在工作。现在我要更改:

const write = async <T = ExtraModels>(data: T[]) => {
  console.log(data[0].unknown)
}

但是它不会与错误一起编译:

类型'T'不存在属性“未知”。ts(2339)

我不明白我在做什么错。根据我的研究,这是有效的。

1 个答案:

答案 0 :(得分:3)

这是有效的,但未达到您的期望。 = ExtraModels表示如果无法根据参数推断T,则ExtraModels将是T。但是T可以是任何类型,包括不扩展ExtraModels的类型(这就是为什么编译器不允许您访问ExtraModels的属性)

您想将T约束为扩展ExtraModels的类型。其语法为T extends ExtraModels。由于T必须扩展ExtraModels,因此打字稿将使您可以访问ExtraModels的属性。

const write = async <T extends  ExtraModels>(data: T[]) => {
  console.log(data[0].unknown)
}