使用模板类型导入jsdoc类型提示



我有一个类型定义模板T模块render.js

/**
* @typedef {(item:T) => String} ItemRenderer<T>
*/
/**
* Render thing
* @param {T} item thing to render
* @returns {String} rendered thing
*/
export function render (item) {
return item.toString()
}

这个类型然后被导入到另一个模块中(我们叫它thing-list.js)

import { render } from './render.js'
/**
* @typedef {import('./render.js'.ItemRenderer<T>)} ItemRenderer<T>
*/
/**
* @returns {ItemRenderer<Thing>} renderer
function getRenderer () {
return render
}
/**
* List Things
* @param {Thing[]} list list of things
* @param {ItemRenderer<Thing>} render function
* @returns {String[]} rendered list
*/ 
function listThings(list, render) {
return list.map(render)
}
listThings(list, getRenderer())

在VSCode中,上面的解析类型直到thing-list.js中的第一个ItemRenderer<T>。然后是any /* unresolved */。这种方法(导入类型定义)目前对所有其他类型都能很好地工作。这是第一个使用模板的。我试图尽可能地简化这个例子,这就是为什么它不是很实用。这只是为了强调使用模板导入类型定义的概念。

这里有人知道这是否可以与JSDoc类型提示(在VSCode中)一起工作,或者如果我做错了什么?

——更新

jsdoc中的答案:用模板扩展类型(用泛型扩展类型)看起来很有希望。

所以我尝试用@template

定义
/**
* @typedef {(item:T, indent:String, last:Boolean, level:Number) => String} TreeItemRenderer<T>
* @template T
*/

这改变了输出,但第二个ItemRenderer仍然没有解析:/

好的,这个@template T是需要的

/**
* @typedef {(item:T, indent:String, last:Boolean, level:Number) => String} TreeItemRenderer<T>
* @template T
*/

,但实际的问题是在import语句中关闭括号的位置。

/**
* @typedef {import('./render.js').ItemRenderer<T>} ItemRenderer<T>
*/

最新更新