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
Run Code Online (Sandbox Code Playgroud)
Converterimplements IConverter,它有一个带有一个参数的方法,但Converter缺少这个参数.如果我们不完全实现此接口,为什么TS编译器不会引发错误?
Tit*_*mir 10
Typescript使用结构化类型确定类型兼容性。对于函数,这意味着您不需要为声明和实现使用完全相同的签名,只要编译器可以确定实现可以安全地通过声明进行调用即可。
在这种情况下,一个函数将较少的参数成为具有更多参数的函数声明的实现,因为多余的传入参数将被实现忽略,因此(因此,大多数情况下不会发生运行时错误)无论如何,取决于的事物可能都有一些极端的案例Function.length)
出现错误v1而不是出现错误的原因v2是,一旦分配完成,编译器将只知道变量的类型,而不是您最初分配给变量的类型,并且将根据变量的实际类型进行检查。因此,v1这意味着IConverter.convert 需要一个参数,而没有方法知道它不需要。因为v2它将检查Converter.convert哪些不需要参数。