如何在TypeType的JSDoc中声明具有其他属性的子类型?

时间:2018-06-26 19:47:18

标签: typescript visual-studio-code jsdoc

如何使用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的功能。

1 个答案:

答案 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