Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
获取识别为接口的typescript类_Typescript_Knockout.js_Typescript Typings - Fatal编程技术网

获取识别为接口的typescript类

获取识别为接口的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;

在尝试升级到TypeScript 3.5时,我遇到了一个签名问题,该签名出于某种奇怪的原因被ts编译器忽略,但已经存在多年了

第三方框架(knockoutJS)要求我传入符合以下要求的内容:

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
和public
foobar
移动到一个接口,并拥有一个创建同时实现该接口和
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);