我正在编写一些基于函数调用(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 }
,但是我的实际代码包含更复杂的对象,我将失去自动生成输入的所有好处。
有没有办法让我用匿名类型内联扩展参数?我在想像initial
或default
关键字这样的东西来获得参数自己的类型,并像这样使用它:
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