假设我有一个像这样的函数:
function validator(obj){
const ret = {};
for (const key in obj){
// Returns a boolean
result = validate(key, obj[key]);
if (result !== true)
ret.error = true;
ret[key] = result;
}
return ret;
}
此函数将返回一个对象,根据传递给该函数的参数动态填充对象的内容。
我可以这样记录功能:
/**
* @param {Object.<string, *>} obj
* @returns {Object.<string, boolean>}
*/
但是它没有记录动态.error
属性,该属性也会返回布尔值。
如果全部返回,我可以简单地写:
/**
* @param {Object.<string, *>} obj
* @returns {{error: boolean}}
*/
但是它现在没有记录动态属性。
我能想到的是这样的:
/**
* @param {Object.<string, *>} obj
* @returns {Object.<string, boolean>|{error: boolean}}
*/
虽然可以使用,但对我来说在语法上似乎不正确。我不能使用@typedef
,因为当我已经知道要使用什么属性时就应该使用它。
在JSDoc's documentation中找不到关于此问题的任何信息。
那么如何记录具有动态和固定属性混合的对象?
答案 0 :(得分:2)
你可以用模板来做到这一点
/**
* @template {Object<string,any>} T
* @param {T} obj
*/
function validator(obj){
/** @type {T & {error?: Boolean}} */
const ret = {};
for (const key in obj){
// Returns a boolean
const result = validate(key, obj[key]);
if (result !== true)
ret.error = true;
ret[key] = result;
}
return ret;
}
代码补全示例