2016-12-17 32 views
0

难以书写声明我正在使用Emscripten embind模块的Typescript声明文件,并且试图为使用Module进行扩展的类获得正确的构造函数自动完成。 Interface.extend。我有一个泛型参数T,它应该扩展多个原型接口中的任何一个(通过重载),只要T与它应该扩展的接口相同,就可以工作。每当我添加一个属性到输入(T)时,它就会失败。我认为T扩展了U,只要它支持所有U,就可以允许任何接口,但它显然不能这样工作。Typescript:Emscripten Encoding Module.Interface.Extend

这是声明:

interface ILoggerPrototypeBase { 
    write(level: LogLevel, message: string); 
    __destruct__?(); 
} 
interface ILoggerPrototype extends ILoggerPrototypeBase { 
    __construct__?(); 
} 
interface ILoggerPrototype1<T1> extends ILoggerPrototypeBase { 
    __construct__?(a1: T1); 
} 
interface ILoggerPrototype2<T1, T2> extends ILoggerPrototypeBase { 
    __construct__?(a1: T1, a2: T2); 
} 
interface ILoggerPrototype3<T1, T2, T3> extends ILoggerPrototypeBase { 
    __construct__?(a1: T1, a2: T2, a3: T3); 
} 
class Logger { 
    write(logLevel: number, message: string); 

    static extend<T extends ILoggerPrototype>(name: string, loggerProto: T): { new(): Logger & T }; 
    static extend<T extends ILoggerPrototype1<T1>, T1>(name: string, loggerProto: T): { new(a1: T1): Logger & T }; 
    static extend<T extends ILoggerPrototype2<T1, T2>, T1, T2>(name: string, loggerProto: T): { new(arg1: T1, arg2: T2): Logger & T }; 
    static extend<T extends ILoggerPrototype3<T1, T2, T3>, T1, T2, T3>(name: string, loggerProto: T): { new(arg1: T1, arg2: T2, arg3: T3): Logger & T }; 
} 

我希望我当时能做

const TestLogger = Logger.extend({ 
    __construct__(someString: string) {}, 
    write(logLevel: LogLevel, message: string) {}, 
    enableLogging() {}, 
    disableLogging() {} 
}) 

但后来我碰到一个“对象文本只能指定已知特性和‘enableLogging’不存在在'ILoggerPrototype3 < {},{},{}>'

如果我删除enableLogging和disableLogging,它找到了正确的重载,并且它工作。不想返回一个构造函数的基本接口(ILoggerPrototype ..)而T3

UPDATE:感谢Nitzan Tomer我已经意识到我需要真正的定义接口,并明确指定模板参数。所以我的解决办法是通过以下方式使用extend

interface ITestLogger extends cxg.ILoggerPrototype1<string> { 
    enableLogging(); 
    disableLogging(); 
} 

const TestLogger = cxg.Logger.extend<ITestLogger, string>('TestLogger', { 
    __construct__(someString: string) { 
    }, 
    enableLogging() { 
    }, 
    disableLogging() { 
    }, 
    write(level: cxg.LogLevel, message: string) { 
    } 
}); 

var logger = new TestLogger('hurray!'); 
+0

enableLogging'和disableLogging定义在哪里?当你实际尝试扩展时,我看不到其他人的踪迹。 –

+0

那些没有在其他地方定义。我希望当我使用'T extends ILoggerPrototype'时,typescript会隐式地使T自己的接口扩展ILoggerPrototype,并且任何附加属性都将成为该隐式接口的一部分。我试着定义另一个接口ITestLogger,它扩展了ILoggerPrototype1 ,并且当我将文字转换为它时,它几乎按照预期工作,但有一点需要注意,它相信arg1是一个对象,而不是一个字符串。我可以使用字符串作为输入,但我希望自动完成说输入应该是一个字符串,而不是对象 –

+0

这是什么'ILoggerPrototype'?你能否把它添加到你的问题?和其他相关信息/代码。 –

回答

0

,我得出的结论,我需要明确定义为原型的一个界面,并调用extend有明确定义要达到什么泛型类型参数我想要。这意味着我应该使用这样的extend

interface ITestLogger extends ILoggerPrototype1<string> { 
    enableLogging(); 
    disableLogging(); 
} 

const TestLogger = Logger.extend<ITestLogger, string>('TestLogger', { 
    __construct__(someString: string) { 
    }, 
    enableLogging() { 
    }, 
    disableLogging() { 
    }, 
    write(level: LogLevel, message: string) { 
    } 
});