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

标签 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

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/

相关文章:

typescript - 如何将整数从 Typescript 枚举转换为其键值作为键的联合类型?

javascript - 如何获取字符串形式的属性名称?

typescript - TypeScript/Angular2 中的 DTO 设计

node.js - npm 包的可安装 typescript 类型定义

angular - 放大 AMCharts 时丢失时间序列

javascript - typescript 推送到数组中的特定键

typescript - 相当于 React.HTMLProps<...> 的 Solid JS

typescript - 如何在 TypeScript 中转换对象属性?

types - 符号 (&) 在 TypeScript 类型定义中是什么意思?

node.js - Typescript - 我可以从一个模块到另一个模块输入 "bolt-on"类型吗?