TypeScript 类型技巧 - 子类方法、属性类型完善
问题
出于不同的原因,我们可能希望让子类的方法、属性类型更精确。比如:
this考虑下面的例子:
import {EventEmitter} from 'events';
class Host extends EventEmitter {
emit(eventName: 'connect'): boolean;
emit(eventName: 'disconnect'): boolean;
emit(eventName: string): boolean {
return super.emit(eventName);
}
on(eventName: 'connect', listener: () => void): this;
on(eventName: 'disconnect', listener: () => void): this;
on(eventName: string, listener: () => void): this {
return super.on(eventName, listener);
}
}为了覆盖原有类型,最直接的办法就是覆盖原有方法、属性。但属性还好,覆盖原有方法必须在新的方法实现中调用父类方法,毫无营养。
技巧
此时我们可以利用 TypeScript 中的声明合并的机制处理,在这个问题下也就是通过合并 class 和 interface 声明实现类型完善:
interface Host {
emit(eventName: 'connect'): boolean;
emit(eventName: 'disconnect'): boolean;
on(eventName: 'connect', listener: () => void): this;
on(eventName: 'disconnect', listener: () => void): this;
}
class Host extends EventEmitter {}注意
- 在进行声明合并时,目前 TypeScript 好像并不会进行与其父类类型兼容性的检查。
- 当类声明中有泛型时,对应的 interface 也需要添加同名泛型。不过泛型约束( extends )和泛型默认类型( = )不需要重复添加。
祝大家举一反三。
原文 https://zhuanlan.zhihu.com/p/491506704
本文内容仅供个人学习、研究或参考使用,不构成任何形式的决策建议、专业指导或法律依据。未经授权,禁止任何单位或个人以商业售卖、虚假宣传、侵权传播等非学习研究目的使用本文内容。如需分享或转载,请保留原文来源信息,不得篡改、删减内容或侵犯相关权益。感谢您的理解与支持!