你会如何在TypeScript中实现这样的目标?
interface Clonable<TAttributes> extends TAttributes { // ERROR: TAttributes is not an interface
clone(): TAttributes
copyFrom(input: TAttributes)
}
function(x : Clonable<{title:string,url:string}>) {
alert(x.title) // ERROR: title is not an property of x
}
背景:我正在尝试使用TypeScript + Mithril + JSX。要在自动完成中公开我的属性,我需要一个带有属性类型的属性“属性”;但是我也希望我的班级直接拥有这些属性,因为写“this.title”而不是“this.attributes.title”会更短。
这里有什么选择吗?
答案 0 :(得分:2)
您可以使用intersection type:
interface Clonable<TAttributes> {
clone(): TAttributes
copyFrom(input: TAttributes)
}
type AttributesClonable<TAttributes> = Clonable<TAttributes> & TAttributes;
function doSomething(x : AttributesClonable<{title:string,url:string}>) {
alert(x.title); // fine now
}