获取typescript默认/初始参数类型以扩展它



我正在编写一些基于函数调用(GraphQL Nexus的东西)自动生成类型提示的代码。

然后,在它的一个函数中,它期望基于那些自动生成的属性的匿名类型:

export const Item = {
isTypeOf(data) {  // data's type is an anonymous type, here it would be '{ name: string }'
...
}
definition(t) {
t.string('name')
}
}

但是,这个data参数可能包含比函数调用定义的变量更多的变量。在我的例子中,我需要访问kind属性,但是我不能调用t._type_函数,因为它会有不希望的副作用。

我也不能把类型作为{ kind: string }传递,因为isTypeOf类型期望它至少在它的参数上具有所有定义的属性。

我可以在这个例子中只使用{ name: string, kind: string },但是我的实际代码包含更复杂的对象,我将失去自动生成输入的所有好处。

有没有办法让我用匿名类型内联扩展参数?我在想像initialdefault关键字这样的东西来获得参数自己的类型,并像这样使用它:

isTypeOf(data: initial & { kind: string })
isTypeOf(data: default & { kind: string })

Typescript并不关心传递给function的对象中的附加键(除非在参数列表中创建)。

如果您只想接受具有给定属性的对象并且不返回

使用isTypeOf

的定义。如果您需要返回相同的类型并可能扩展它,请使用definition的定义。

export const Item = {
isTypeOf(data: { kind: string }): boolean {
return data.kind == '...';
},
definition<T extends { string: (key: string): void }>(t): T & { defined: true } {
t.string('name');
(t as T & { defined: true }).defined = true;
return t;
},
};
const myType = {
kind: 'hello',
name: 'World',
string(key: string): {},
};
Item.isTypeOf(myType); // OK
Item.isTypeOf({ kind: 'hello', name: 'World' }); // Not OK
Item.definition(myType); // OK
Item.definition({ string(key: string): {} }); // OK

相关内容

  • 没有找到相关文章

最新更新