在typescript中扩展泛型接口

时间:2014-10-30 11:48:13

标签: typescript

我想构建一个函数,它接受任何对象并返回具有少量添加属性的对象。类似的东西:

    //this code doesn't work   
        function addProperties<T>(object: T): IPropertiesToAdd<T> {/*implmentions code*/};

        interface IPropertiesToAdd<T> extend T{
            on(): void;
            off(): void;
        }

//usage example
var str = new String('Hello')
addProperties(str)
str.charAt(3)
str.on() 

对于上面的代码打字稿编译器返回一个接口只能添加一个类或接口的错误,我怎么能在打字稿中表达这个。

3 个答案:

答案 0 :(得分:17)

接口IPropertiesToAdd定义了一个类型变量T,用于扩展名为T的接口。这是不可能的。无法使用变量名称引用接口;它必须有一个固定的名称,例如EVNT:

interface Evnt<T> {
  name: T;
}

interface IPropertiesToAdd<T> extends Evnt<T> {
  on(): void;
  off(): void;
}

我不确定你在想要实现的目标。我已经扩展了一些示例,因此它编译:

function addProperties<T>(object: Evnt<T>): IPropertiesToAdd<T> {
  /* minimum implementation to comply with interface*/
  var ext:any = {};
  ext.name = object.name
  ext.on = function() {};
  ext.off = function() {};
  return ext;
};

interface Evnt<T> {
  name: T;
}

interface IPropertiesToAdd<T> extends Evnt<T> {
  on(): void;
  off(): void;
}

//usage example
var str = {name: 'Hello'}
var evnt = addProperties(str)
evnt.charAt(3); // error because evnt is not of type 
                // `string` but `IPropertiesToAdd<string>`
evnt.on()

答案 1 :(得分:15)

您可以创建一个新的type alias,它允许您的对象继承另一个对象类型的功能。我找到了这段代码here

type IPropertiesToAdd<T extends {}> = T & {    // '{}' can be replaced with 'any'
    on(): void
    off(): void
};

interface ISomething {
    someValue: number
}

var extendedType: IPropertiesToAdd<ISomething> = {
    on(): void {
        console.log("switched on");
    },
    off(): void {
        console.log("switched off");
    },
    someValue: 1234,
};

我已经对此进行了测试,似乎&#39; T&#39;可以是接口,类和数组类型。我无法让工会类型发挥作用。

这仅适用于匿名对象,不能用于实际的继承目的。

希望这有帮助。

答案 2 :(得分:1)

我用以下方法解决问题:

type IModelProperty<T = Record<string, any>> = T & {
     on(): void;
     off(): void;
};