在 Typescript 中扩展泛型参数

Gro*_*kys 5 knockout.js typescript

我想创建一个实用程序函数,它通过向isChecked数组中的每个项目添加一个敲除 observable 属性来创建一个清单。此函数应如下所示:

createCheckList<T>(allEntities: T[], selected: T[]) : CheckListItem<T> {
    ...
}
Run Code Online (Sandbox Code Playgroud)

我返回 aCheckListItem<T>因为这个接口应该扩展 T 来添加isChecked属性。但是,打字稿不允许我这样做:

interface CheckListItem<T> extends T {
    isChecked: KnockoutObservable<boolean>;
}
Run Code Online (Sandbox Code Playgroud)

给了我错误:

一个接口只能扩展另一个类或接口。

有没有办法做到这一点?

omi*_*nug 7

从 TypeScript 1.6 开始,您可以使用交集类型

type CheckListItem<T> = T & {
  isChecked: KnockoutObservable<boolean>;
};
Run Code Online (Sandbox Code Playgroud)


Rya*_*ugh 3

没有办法在 TypeScript 中表达这一点。

显然你可以这样做:

interface CheckListItem<T> {
    isChecked: KnockoutObservable<boolean>;
    item: T;
}
Run Code Online (Sandbox Code Playgroud)

这样做的好处是,当对象恰好拥有自己的isChecked属性时,不会破坏该对象。