获取识别为接口的typescript类
在尝试升级到TypeScript 3.5时,我遇到了一个签名问题,该签名出于某种奇怪的原因被ts编译器忽略,但已经存在多年了 第三方框架(knockoutJS)要求我传入符合以下要求的内容:获取识别为接口的typescript类,typescript,knockout.js,typescript-typings,Typescript,Knockout.js,Typescript Typings,在尝试升级到TypeScript 3.5时,我遇到了一个签名问题,该签名出于某种奇怪的原因被ts编译器忽略,但已经存在多年了 第三方框架(knockoutJS)要求我传入符合以下要求的内容: interface ViewModelFunction { (params?: any): any; } 显然,在运行时,它可以执行以下操作: class MyClass { public foobar: string; constructor(params: { foo: string;
interface ViewModelFunction {
(params?: any): any;
}
显然,在运行时,它可以执行以下操作:
class MyClass {
public foobar: string;
constructor(params: { foo: string; bar: number }) {
this.foobar = params.foo + params.bar;
}
public doSomething = () => {
return this.foobar.length;
}
}
然后将MyClass发送到需要ViewModelFunction作为属性的函数中。由于代码有效,这主要是一个类型脚本问题。ts3.5突然注意到了这一点,这是一个谜(但并不重要),但没有任何版本的typescript会接受类似这样的东西
class MyClass implements ViewModelFunction{...}
那么,有没有办法将类转换为ViewModelFunction接口呢?您可以将
doSomething
和publicfoobar
移动到一个接口,并拥有一个创建同时实现该接口和ViewModelFunction
的对象的函数
interface ViewModelFunction {
(params?: any): any;
}
interface MyClass {
foobar: string;
doSomething(): number;
}
interface MyF extends MyClass, ViewModelFunction {}
function getMyF(foobar: string): MyF {
const res = () => {yourViewModel();};
res.foobar = foobar;
res.doSomething = () => foobar.length;
return res;
}
你确定不是淘汰赛的定义改变了吗?这是一个错误,至少2.4:是。我认为这是TS3.5中工会改进的结果。想知道一个更准确的例子,请看:你能给我一个例子,让我看看你在说什么吗?我很困惑如图所示的
MyClass
如何实现ViewModelFunction
,所以我可能遗漏了一些东西。您可能可以使用,如在接口MyClass Extendes ViewModelFunction{}
中,使警告静音,但我恐怕建议您这样做,因为它看起来很危险。是的,在我上面的注释中是链接,您可以从顶部的下拉列表中选择ts版本,它在3.5中开始失败。代码应该在问题中,而不是注释(您可以编辑问题)。无论如何,看起来您正在将类构造函数传递给只接受ViewModelFunction
…的对象,但这确实应该是一个错误。如果您尝试像函数一样调用构造函数,则可能会遇到类似TypeError的错误:在运行时必须使用| new |
调用类构造函数。理想情况下,您应该uld制作一个实际的ViewModelFunction
实例,如(x:any)=>新的MyClass(x)
并使用它而不是MyClass
。这有帮助吗?或者如果没有,你能演示它应该如何工作吗?祝你好运!我需要将与ViewModelFunction匹配的内容发送到另一个函数中。我认为此解决方法不会以任何方式改变这一点。getMyF
的结果与ViewModelFunction
匹配。并且这不是一个解决方法,它实际上是创建一个也有方法的函数的有效解决方案。const getViewModel=():ViewModelFunction=>(params)=>newmyclass(params);
这个简单的解决方案似乎可以解决问题。无需重新实现这些函数。
const viewModel: ViewModelFunction = params => new MyClass(params);