如何构造一个描述在功能参数上进行的突变的类型?

时间:2018-07-18 09:25:52

标签: typescript typescript-typings

可以说我已经用javascript编写了此功能:

//index.js
function foo(obj) {
  obj['bar'] = 'biz';
}
module.exports.foo = foo;

如何为此创建打字稿定义?

我尝试使用is运算符:

//index.d.ts
export function foo<T>(obj: T): T is T & { bar: string }

但是我似乎无法使类型系统将bar识别为我传递给foo的内容的有效键。

我该怎么做?

2 个答案:

答案 0 :(得分:1)

类型防护会影响参数的类型,并且必须返回布尔值。因此,有效的实现将是:

function foo<T>(obj: T): obj is T & { bar: string }{
    obj['bar'] = 'biz';
    return true;
}

let o = { foo: "string" }
if(foo(o)) {
    o.bar //valid
    o.foo //valid
}

不幸的是,没有类型可以输入防护的断言模式。类型防护必须返回booelan,并在if语句中使用,以影响变量的类型。

答案 1 :(得分:0)

由于@ TitianCernicova-Dragomir提供的答案,我最终这样做是这样的:

function foo<T>(obj: T): obj is T & { bar: string }{
    obj['bar'] = 'biz';
    return true;
}

const obj = { foo: "string" }
if(!foo(obj)) throw 'This will never happen';

o.bar //valid
o.foo //valid