TypeScript接口实现不检查方法参数

Wac*_*urn 12 typescript

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哪些不需要参数。

  • 有兴趣的相关[常见问题解答条目](https://github.com/Microsoft/TypeScript/wiki/FAQ#why-are-functions-with-fewer-parameters-assignable-to-functions-that-take-more-parameters)派对 (2认同)

Mat*_*hen 6

TypeScript 允许将采用较少参数的函数视为采用较多参数的函数类型,因为额外的参数在运行时将被忽略。参见手册