gpt4 book ai didi

javascript - 如何在 JSDoc 函数中使用 @template 来创建参数和返回类型之间的一致性?

转载 作者:行者123 更新时间:2023-12-05 06:14:22 24 4
gpt4 key购买 nike

我使用 @ts-check以及 ecmascript projet 上的 ts linter(我不能使用 typescript 但想要它的形式主义)。

除一件事外一切顺利:我想使用 JSDoc 泛型声明,以便返回类型绑定(bind)到/从参数类型推断:

/**
* @template V - Type de valeurs de la map.
* @param {Map<string, V>} map
* @returns {Object.<string, V>}
*/
function objectifyMap(map) {
/** @type {Object.<string,V>} */
const result = {};
map.forEach((value, key) => { result[key] = value; });
return result;
}

/**
* @template V
* @param {Object.<string, V>} object
* @returns {Map<string, V>}
*/
function mappifyObject(object) {
/** @type {Map<string,V>} */
const result = new Map();
Object.entries(object).forEach(([key, value]) => { result.set(key, value); });
return result;
}

/** @type {Object.<string, string>} */
const obj = {};

/** @type {Map<string, string>} */
let map;
map = mappifyObject(obj);

但在最后一行,ts linter 在 obj 上抛出错误参数:

Argument of type '{ [x: string]: string; }' is not assignable to parameter of type '{ [x: string]: V; }'.
Index signatures are incompatible.
Type 'string' is not assignable to type 'V'.
'V' could be instantiated with an arbitrary type which could be unrelated to 'string'.ts(2345)

我猜 ts linter 期待 map = mappifyObject<string>(obj);但因为我只使用 @ts-check而不是 typescript 转译器,我不能那样做。

有人知道如何规避吗?

最佳答案

我不熟悉 Object.<K, V>键入您正在使用的语法。在实际的 TypeScript 中,输入将是 {[x: string]: V}Record<string, V> .这些类型中的任何一种都适合我:

/**
* @template V
* @param {{[x: string]: V}} object
* @returns {Map<string, V>}
*/
function mappifyObject(object) {
/** @type {Map<string,V>} */
const result = new Map();
Object.entries(object).forEach(([key, value]) => { result.set(key, value); });
return result;
}

/** @type {{[x: string]: string}} */
const obj = {};

/** @type {Map<string, string>} */
let map;
map = mappifyObject(obj);

/**
* @template V
* @param {Record<string, V>} object
* @returns {Map<string, V>}
*/
function mappifyObject(object) {
/** @type {Map<string,V>} */
const result = new Map();
Object.entries(object).forEach(([key, value]) => { result.set(key, value); });
return result;
}

/** @type {Record<string, string>} */
const obj = {};

/** @type {Map<string, string>} */
let map;
map = mappifyObject(obj);

两者都没有错误。

关于javascript - 如何在 JSDoc 函数中使用 @template 来创建参数和返回类型之间的一致性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62919277/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com