javascript通过运行时检查模拟接口约束,即在使用对象前验证其是否具备指定名称且类型为函数的方法;定义interface构造函数记录接口名和方法列表,提供ensureimplements校验函数检查对象是否实现全部要求方法,未满足则抛出明确错误,从而在调用前主动暴露问题。

JavaScript 本身没有 interface 关键字,但可以在类中通过运行时检查来模拟接口约束——核心思路是:**在使用对象前,验证它是否具备指定名称的方法且类型为函数**。这不是编译期检查,而是主动校验,能有效防止调用缺失方法时报错。
定义接口构造器,声明方法契约
先创建一个通用的 Interface 构造函数,用于描述“该接口要求哪些方法”:
const Shape = new Interface('Shape', ['draw', 'area']);
它不创建实例,只记录接口名和必需方法列表(字符串数组),作为契约模板。
编写校验函数,强制检查实现情况
提供一个静态工具函数,在关键入口处(如工厂函数、依赖注入点)执行检查:
- 接收待检查对象 + 一个或多个接口实例
- 遍历每个接口的
methods数组 - 对每个方法名,确认对象上有同名属性,且
typeof obj[methodName] === 'function' - 任一方法缺失或非函数,立即抛出明确错误,如
"Circle does not implement method 'area'"
在类中显式“声称实现”,并确保方法真实存在
类本身不需要继承或 implements 关键字,但需满足两点:
- 原型上必须定义所有接口要求的方法(不能只声明不实现)
- 推荐在构造函数或文档中标注所支持的接口,例如:
// implements Shape
class Circle {
constructor(radius) { this.radius = radius; }
draw() { console.log('circle drawn'); }
area() { return Math.PI * this.radius ** 2; }
}
实际使用时主动触发校验
不要等到调用时才暴露问题。在校验点统一把关:
function render(shape) {
Interface.ensureImplements(shape, Shape); // ← 这里就报错,不进 draw()
shape.draw();
}
这样既保留了 JS 的灵活性,又获得了接近强类型语言的可维护性和早期错误反馈。











