描述
那些使用 JavaScript + JSDoc 而不是 TypeScript 的人经常会遇到类型定义的问题。例如,interface
从 TypeScript 中,您可以在 JSDoc 中实现它,如下所示:
- 类型脚本
interface Type {
property1: number;
property2: number;
}
- JS文档
/**
* @typedef {object} Type
* @property {number} property1
* @property {number} property2
*/
问题始于继承。还有两个大的:
简单的继承。
最常见的继承应该使用一些额外的类型和拐杖来实现:
- 打字稿
interface Base {
baseProperty: number;
}
interface Derived extends Base {
derivedProperty: number;
}
- JS文档
/**
* @typedef {object} Base
* @property {number} baseProperty
*/
/**
* @typedef {object} DerivedExtension
* @property {number} derivedProperty
*/
/**
* @typedef {Base & DerivedExtension} Derived
*/
继承不变
如果你继承了一个类型并且不改变其中的任何内容,编译器也会崩溃:
- 打字稿
interface Base {
property: number;
}
interface Derived extends Base { }
- JS文档
/**
* @typedef {object} Base
* @property {number} baseProperty
*/
/**
* Этот вариант приведет к ошибке
* @typedef {object} DerivedExtension // Получаем any
*
* @typedef {Base & DerivedExtension} Derived // А тут Base & any = any
*/
/**
* А вот это уже 👍
* @typedef {{ }} DerivedExtension // Типа пустой объект
*
* @typedef {Base & DerivedExtension} Derived // А тут Base & { } = Base
*/
虽然第二个选项不是最好的,因为它根本不表明存在继承:
此外
我知道这不完全是继承,但由于标签@extends
或@implements
不起作用,我别无选择。
问题
有什么办法可以修复这些拐杖吗?也许您知道更有效的
使用方法?@typedef
好吧,拿走它并继承它......
为什么这不适合你?
没有任何东西的继承