将打字稿 class 识别为接口
Getting a typescript class recognized as an interface
在尝试升级到 TypeScript 3.5 时,我遇到了一个签名问题,由于某种奇怪的原因,该签名已被 ts-compiler 忽略,但多年来一直存在。
第三方框架 (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{...}
那么是否有任何方法可以将 Class 转换为 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;
}
const viewModel: ViewModelFunction = params => new MyClass(params);
在尝试升级到 TypeScript 3.5 时,我遇到了一个签名问题,由于某种奇怪的原因,该签名已被 ts-compiler 忽略,但多年来一直存在。
第三方框架 (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{...}
那么是否有任何方法可以将 Class 转换为 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;
}
const viewModel: ViewModelFunction = params => new MyClass(params);