我使用的是Typescript 2.2的mixins,并希望使用另一个mixin的属性。
文档显示mixins可以被约束为只混合到某些类......
const WithLocation = <T extends Constructor<Point>>(Base: T) =>
class extends Base {
getLocation(): [number, number] {
return [this.x, this.y];
}
}
是否可以将它们限制为只混合到包含另一个mixin的类中?
答案 0 :(得分:4)
是的,有可能。定义您的其他mixin,以便它由界面支持。例如:
interface Named {
name: string;
}
function Named<T extends Constructor<{}>>(Base: T) {
return class extends Base implements Named {
name: string;
};
}
然后,您可以在Constructor
类型参数的交集类型中使用该接口:
const WithLocation = <T extends Constructor<Point & Named>>(Base: T) =>
class extends Base {
getLocation(): [number, number] {
console.log(this.name); // compiles
return [this.x, this.y];
}
};
const NamedPointWithLocation = WithLocation(Named(Point));
const PointerWithLocation = WithLocation(Point); // error, expects argument to be Named
你可以看到一个更复杂的例子here,它将在使用声明文件进行编译时起作用。