TypeScript接口实现';t检验方法参数
TypeScript接口实现';t检验方法参数,typescript,Typescript,Converter实现了IConverter,该方法只有一个参数,但Converter缺少此参数。如果我们没有完全实现此接口,为什么TS编译器不会引发错误?TypeScript允许将接受较少参数的函数视为接受较多参数的函数类型,因为额外的参数在运行时将被忽略。请参阅。类型脚本使用结构类型来确定类型兼容性。对于函数,这意味着声明和实现不需要完全相同的签名,只要编译器可以确定通过声明调用的实现是安全的 在这种情况下,这归结为,对于具有更多参数的函数声明,函数将使用更少的参数作为实现,因为额外传入的参
Converter
实现了IConverter
,该方法只有一个参数,但Converter
缺少此参数。如果我们没有完全实现此接口,为什么TS编译器不会引发错误?TypeScript允许将接受较少参数的函数视为接受较多参数的函数类型,因为额外的参数在运行时将被忽略。请参阅。类型脚本使用结构类型来确定类型兼容性。对于函数,这意味着声明和实现不需要完全相同的签名,只要编译器可以确定通过声明调用的实现是安全的
在这种情况下,这归结为,对于具有更多参数的函数声明,函数将使用更少的参数作为实现,因为额外传入的参数将被实现忽略,因此不会因此发生运行时错误(无论如何,在大多数情况下,依赖于Function.length
的东西可能会有一些极端情况)
在v1
而不是v2
上出现错误的原因是,一旦赋值完成,编译器只知道变量的类型,而不是您最初赋给它的类型,并将根据变量的实际类型进行检查。因此对于v1
这意味着IConverter.convert
需要一个参数,无法知道它不需要。对于v2
,它将检查Converter.convert
,已知它不需要参数。与相关方相关
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