当前位置: 首页 > 知识库问答 >
问题:

如何在JSDoc for TypeScript中声明具有附加属性的子类型?

颛孙飞鸾
2023-03-14

如何使用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:Type“{name:string;age:number;}” 不可分配给类型“Base”

对象字面量只能指定已知属性,'age'在类型'Base'中不存在。

请注意,尽管有一个@返回{AugmentedBase}注释,但对象文字并不匹配!

原因:我正在用Visual Studio代码编写JavaScript,并希望充分利用其TypeScript linting。


共有1个答案

商麒
2023-03-14

你不能这样做,而不是以tsc实际会提供线索的方式。

tsc(至少从2.9.2开始)仅支持在base@type声明为对象对象[]时将@Propertys附加到@typedef名称。

此时在编译器/解析器中使用@typedef{NotObject}MyType语法时,可以看到它显式跳过任何属性。ts:parseTypedefTag()。

如果您试图变得聪明,而是将@typedecl放在所有@Propertydecl之后,例如:

/**
 @typedef MyType
 @property {string} x
 @type NotObject
*/

然后,TypeScript编译器将成功解析出所有属性,只是故意忽略它们,而在编译器/解析器中稍晚一点说“MyType的类型只是直接向上的NotAnObject”。ts:parseTypedefTag()。

 类似资料:
  • 我最近盯着Kotlin看,有Java的经验。在Java中,我们可以声明与在parent中同名的字段。当我在中这样做时,它给出错误的成员。我错过了什么?

  • 问题内容: 如何在Python中声明静态属性? 这里写了我如何声明一个方法: Python中的静态方法? 问题答案: 在Python的类级别定义的所有变量均被视为静态 在类中,您可以使用相同的名称拥有两个不同的变量(一个静态变量和一个普通变量)。不要困惑。

  • 正如在 声明性映射 ,声明式样式包括生成映射 Table 对象,或容纳 Table 或其他 FromClause 直接对象。 以下示例假定声明性基类为: from sqlalchemy.orm import declarative_base Base = declarative_base() 下面的所有示例都说明了从上面继承的类 Base . 装饰风格 使用修饰符的声明性映射(无声明基) 下面的

  • 我是网络开发新手,所以这可能是非常基本的。如果datainfo prop变量不是空的,我想向div标记添加一个数据属性 但是现在,如果datavalue是空的,则data属性会添加一个空值。相反,我希望它根本不会出现在div标签中。 我可以在JSX子句中添加整个内容吗?

  • 我已经在Jenkins上创建了一个基本的声明性管道。当我运行构建时,它会抛出以下错误 Jenkins服务器使用最新版本的默认插件设置为默认。Jenkinsfile如下所示 当Jenkins读取Jenkinsfile时,看起来块失败了,这在Jenkinsfile看起来很混乱。