当实施ITransformer
您可以覆盖的接口transform
具有不同的签名,例如:
class Transformer implements ITransformer<Input, Output> {
transform(input: string): Output;
transform(input: number): Output;
transform(input: Input): Output;
transform(input: any): Output {
// ...
}
}
您不必只在接口中实现签名。因此,您必须隐式编写类型:
transform = (input: Input) => new Output(input.name);
至于为什么会这样:
transform = (input: Test) => new Test();
那是因为TypeScript 基于结构子类型 https://www.typescriptlang.org/docs/handbook/type-compatibility.html并且这两种类型具有相同的结构({ name: string }
)。尝试仅向其中一个属性添加另一个属性,您将收到错误消息。
我想指出的最后一件事是,定义类方法的方式实际上不会创建方法,而只是创建具有函数类型的成员:
class Test {
method1() { }
method2 = () => {}
}
仅此method1
确实是一种方法,同时method2
只是在构造函数中分配的属性,它不会成为原型的一部分,并且如果扩展类,您将无法覆盖它。
这是此代码的编译版本:
var Test = (function () {
function Test() {
this.method2 = function () { };
}
Test.prototype.method1 = function () { };
return Test;
}());
这种方法很好并且正在使用,但请注意。