Typescript,准确地表示类方法的行为
Typescript, accurately represent class method behavior
我有几个接口和一个类,它接受一个可选的options对象:
interface asObject { a: number, b: number }
interface options { returnAs: string; }
interface IA {
go(): string;
go(o: options): string | asObject;
}
class A implements IA {
public go(o?: options): string | asObject {
if(o&& o.returnAs && typeof o.returnAs === 'string') {
switch(o.returnAs) {
case 'object':
return { a: 5, b: 7 };
default:
return 'string';
}
}
}
}
我得到的错误是:"类A
错误地实现了接口IA
"。
如果我尝试重载一个方法:
...
public go(): string;
// Notice the parameter is no longer optional, ? removed.
public go(o: options): string | asObject { /* implementation as above */ }
...
现在我得到:"重载签名与函数实现不兼容"。
我知道我可以删除IA
接口上的重载签名,并删除A
类上的重载方法:
// Interface IA, notice the parameter is now optional, ? added.
go(o?: options): string | asObject;
// Class A
public go(o?: options): string | asObject { /* implementation as above */ }
让我解释一下:
A
类有一个叫做go
的方法,如果go
没有提供options对象,它将返回一个字符串,但是如果用户提供了一个options对象,返回值取决于returnAs
字段,意思是字符串或对象。
我的问题:
我认为我提供的解决方案不能准确地代表go
方法的行为。
是否有一种方法来保留准确的行为,为了typescript的使用,而不是得到错误,因为我做了我上面描述的前2次尝试?
我说的准确行为是指:
我正在寻找一种方式,typescript将能够推断AObject
类型为string
:
var AObject = new A().go();
并且它将能够推断AObject
为string
或asObject
:
var AObject = new A().go({ returnAs: 'object|string' });
我不能百分之百肯定这在打字稿中是可能的,如果是那样的话,我很高兴能得到建议。
最简单的方法是将A.go
的结果声明为any
:
public go(o?: options): any {
或声明函数接口:
interface asObject { a: number, b: number }
interface options { returnAs: string; }
interface IGoFunction {
(): string;
(o: options): string | asObject;
}
interface IA {
go: IGoFunction;
}
class A implements IA {
go = <IGoFunction>function (o?: options): string | asObject {
if (o && o.returnAs && typeof o.returnAs === 'string') {
switch (o.returnAs) {
case 'object':
return { a: 5, b: 7 };
default:
return 'string';
}
}
}
}
实际上你甚至不需要声明命名接口:
class A {
go = <{
(): string;
(o: options): string | asObject;
}>function (o?: options): string | asObject {
...
缺点是该函数被添加到A
的每个实例中,但是您可以显式地将它添加到prototype中:
class A {
go: {
(): string;
(o: options): string | asObject;
};
}
A.prototype.go = function (o?: options): any {
...
相关文章:
- 使构造函数参数具有ES6类方法的特权
- 可以“;超级“;可以在子类的方法内部使用,在不直接引用的情况下调用相应的超类方法
- Javascript中的类方法
- 在 Array.map() 中调用类方法
- 未定义的方法“+”表示 nil 类
- 从类方法中的 ajax post 函数回调函数更改 javascript 类属性
- 类方法中的上下文作为变量
- 如何将类方法设置为等于多个函数?-Javascript
- 将类方法绑定到类外绑定的事件处理程序内的AJAX成功回调
- Node.JS:类方法作为回调
- 如何从将在html页面中使用的java脚本中调用java类方法
- 在类方法中使用React.js静态
- 在不使用@syntax的情况下修饰ES6类方法
- 如何使用jQuery通过ajax调用php类方法,但不需要任何php处理程序文件
- 从常规ES6类方法中调用静态方法
- crypto-js如何隐藏类方法
- 当使用Q/promises/异步函数时,如何将一个值从一个类方法返回到另一个类
- 使用javascript创建自己的隐藏类方法
- javascript ES6类/方法范围
- Typescript,准确地表示类方法的行为