可以说我已经用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
的内容的有效键。
我该怎么做?
答案 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