如何使用JSDoc注释向TypeScript编译器声明“类型X具有类型Y的所有属性以及其他属性”?
给出:
/**
A base type with one property.
@typedef {object} Base
@prop {string} name
*/
/**
A subtype that adds a second property.
@typedef AugmentedBase
@type {Base}
@prop {number} age
*/
/**
A function declared to return AugmentedBase, so name + age.
@returns {AugmentedBase}
*/
const shouldReturnAugmentedBase = () => {
return {name: 'a', age: 3}
}
何时: 我通过运行以下命令对此进行检查:
tsc --allowJs --checkJs --noEmit index.js
然后: 我希望在使用TypeScript进行检查时不会出错。
但是:
实际上,根据以下错误判断,看来似乎忽略了AugmentedBase
添加的属性,并将其仅视为Base
:
错误TS2322:类型
'{ name: string; age: number; }'
无法分配给类型'Base'
。对象文字只能指定已知的属性,
'age'
类型的'Base'
不存在。
请注意,尽管有Base
注释,但对象文字不匹配@returns {AugmentedBase}
令人着迷!
为什么: 我正在用Visual Studio Code编写JavaScript,并希望充分利用TypeScript的功能。
答案 0 :(得分:0)
您不能这样做,不会以tsc
真正暗示的方式出现。
tsc
(至少从2.9.2版开始)仅在基本@property
被声明为@typedef
时支持将@type
附加到object
名称上或object[]
。
在this point in compiler/parser.ts:parseTypedefTag()使用@property
语法时,您可以看到它显式跳过了任何@typedef {NotObject} MyType
。
如果您尝试变得更聪明,而是将@type
末尾放在@property
末尾之后,例如:
/**
@typedef MyType
@property {string} x
@type NotObject
*/
然后,TypeScript编译器将成功解析所有属性,而只是故意忽略它们,而是说this slightly later point in compiler/parser.ts:parseTypedefTag()的MyType
的类型是简单的NotAnObject
”