【问题标题】:TypeScript JSDoc annotations for a function that adds an object property用于添加对象属性的函数的 TypeScript JSDoc 注释
【发布时间】:2021-05-16 10:13:04
【问题描述】:

我正在一个拥有大量 JSDoc cmets 的项目中工作,我想开始利用 tscJSDoc style annotations

给定一个向对象添加属性的函数,如下所示:

/**
 * @param {object} obj
 * @param {string} n
 * @return void
 */
function addName(obj, n) {
    obj.name = n;
}

let thing = {size: "medium"};
addName(thing, "product");
console.log(thing.name);

有没有办法声明对象将通过附加属性进行变异?

【问题讨论】:

  • 我不认为这是可能的。因为在打字稿中是不可能的。或者它是?

标签: typescript jsdoc


【解决方案1】:

这种方法是否满足您真实案例的需求?它从表面上解决了您描述的问题,但也许您无法更改任何东西的签名以采用这种更“不可变”的模式。

function addName<O extends object, V>(obj:O, val:V): O & {name:V} {
    return {
      ...obj,
      name:val
    }
}

let thing = {size: "medium"};
let newThing = addName(thing, "product");
console.log(newThing.name);

【讨论】:

    【解决方案2】:

    继续往下走,鉴于addName 的当前签名返回 void,您可以让它始终返回布尔值并将其转换为类型谓词。然后任何由赋值的布尔返回值保护的东西都将使用额外的已知参数正确输入

    function addName(obj:object, n:string) : obj is typeof obj & {name:string}{
        (obj as any).name = n;
        return true
    }
    
    let thing = {size: "medium"};
    if(addName(thing, "product")){
      console.log(thing.name);
    }
    

    【讨论】:

      猜你喜欢
      • 2020-02-21
      • 2015-06-02
      • 1970-01-01
      • 2021-03-31
      • 2014-11-04
      • 1970-01-01
      • 2017-11-13
      • 2021-06-09
      相关资源
      最近更新 更多