难以书写声明我正在使用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!');
enableLogging'和disableLogging定义在哪里?当你实际尝试扩展时,我看不到其他人的踪迹。 –
那些没有在其他地方定义。我希望当我使用'T extends ILoggerPrototype'时,typescript会隐式地使T自己的接口扩展ILoggerPrototype,并且任何附加属性都将成为该隐式接口的一部分。我试着定义另一个接口ITestLogger,它扩展了ILoggerPrototype1,并且当我将文字转换为它时,它几乎按照预期工作,但有一点需要注意,它相信arg1是一个对象,而不是一个字符串。我可以使用字符串作为输入,但我希望自动完成说输入应该是一个字符串,而不是对象 –
这是什么'ILoggerPrototype'?你能否把它添加到你的问题?和其他相关信息/代码。 –