TypeScript JSDoc 风格的类型是不是具有常规类型的全部功能?

Posted

技术标签:

【中文标题】TypeScript JSDoc 风格的类型是不是具有常规类型的全部功能?【英文标题】:Does TypeScript JSDoc-style typing have full power of regular types?TypeScript JSDoc 风格的类型是否具有常规类型的全部功能? 【发布时间】:2019-01-21 18:21:55 【问题描述】:

TypeScript 据说是 "turing complete"。 JSDoc 风格的类型是否与常规类型一样功能齐全?能不能做映射类型、条件类型、keyof等,以及所有常规类型的事情?

只是好奇,因为我想为 JS 文件声明类型,这些文件实现了类工厂 mixins,并定义了接受对象并返回从对象定义生成的类的定义函数。生成的类应该具有受保护的和私有的成员,并且混合应该返回具有受保护/私有成员的类。

我想键入这些内容而不必转换为.ts 文件,只需保持 JS 代码不变即可。

是否可以使用 JSDoc cmets 键入诸如从对象字面量定义和类工厂 mixins 生成的类等元内容?

【问题讨论】:

这似乎混淆了两个不同的概念。图灵完备并不意味着第二段中描述的表现力,反之亦然。您是在问 TS 中的 JS Doc 是否可以表达所有与常规类型声明/注释相同的概念,或者它是否是一个图灵完备的系统? @RyanCavanaugh 我在问前者,TS 中的 JSDoc 是否可以表达所有与常规类型声明/注释相同的概念。可以吗? 【参考方案1】:

并非所有可以在 TypeScript 中表达的类型都可以在 JSDoc 中表示。示例:

/**
 * @typedef Parameters
 * A tuple of the types of the parameters of a function.
 * @template T
 * @type (T extends (...args: infer U) => * ? U : never)
 */

尝试使用此类型会导致 TypeScript 服务认为 Paramaters<T> = any。这意味着不支持条件类型。

一般而言,您可以通过编写类型并查看服务是否放弃并只是说它是any来确定JSDoc是否支持。

【讨论】:

好吧,我想我会求助于.d.ts 文件来描述我的.js 文件。最好在一个 .js 文件中完成所有操作!

以上是关于TypeScript JSDoc 风格的类型是不是具有常规类型的全部功能?的主要内容,如果未能解决你的问题,请参考以下文章

VS Code 中的 Vue Array Prop JSDoc TypeScript 错误:“ArrayConstructor”类型缺少“MyCustomType []”类型中的以下属性

使用从 JSDoc 生成的类型声明:TS7016

用于接口属性的 TypeScript jsdoc

第1639期如何使用 JSDoc 保证你的 Javascript 类型安全性

JSDoc Typescript声明:如何隐藏“私有”方法

[TypeScript] Type check JavaScript files using JSDoc and Typescript 2.5