interface IConverter {
convert(value: number): string
}
class Converter implements IConverter {
convert(): string { // no error?
return '';
}
}
const v1: IConverter = new Converter();
const v2: Converter = new Converter();
v1.convert(); // error, convert has parameter, although Converter's convert doesn't expect one
v2.convert(); // ok, convert has no parameters, although Converter implements IConverter which should has paramater
Converter
实现了IConverter
,它有一个带一个参数的方法,但是Converter
没有这个参数。如果我们没有完全实现此接口(interface),为什么 TS 编译器不会引发错误?
最佳答案
Typescript 使用结构类型来确定类型兼容性。对于函数,这意味着声明和实现不需要完全相同的签名,只要编译器可以确定实现可以安全地通过声明调用即可。
在这种情况下,归结为,具有较少参数的函数可以是具有更多参数的函数声明的实现,因为额外传入的参数将被实现忽略,因此不会因此发生运行时错误(无论如何,对于大多数情况,可能存在依赖于 Function.length
)
你在 v1
而不是 v2
上出错的原因是一旦赋值完成编译器只知道变量的类型而不是你最初赋值的类型它将根据变量的实际类型进行检查。所以对于 v1
这意味着 IConverter.convert
需要一个参数,没有办法知道它不需要。对于 v2
,它将检查已知不需要参数的 Converter.convert
。
关于TypeScript 接口(interface)实现不检查方法参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51727721/