继承作为泛型参数给出的接口

时间:2017-02-22 20:02:46

标签: typescript

你会如何在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”会更短。

这里有什么选择吗?

1 个答案:

答案 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
}

code in playground