获取打字稿默认/初始参数类型以扩展它
Posted
技术标签:
【中文标题】获取打字稿默认/初始参数类型以扩展它【英文标题】:Get typescript default/initial argument type in order to extend it 【发布时间】:2021-12-07 07:40:18 【问题描述】:我正在编写一些基于函数调用(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 )
【问题讨论】:
喜欢typeof data & kind: string
?
【参考方案1】:
Typescript 不关心传递给函数的对象中的附加键(除非在参数列表中创建)。
如果您只想接受具有给定属性的对象并且不返回,请使用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
【讨论】:
也许我忘了在我的回答中解释,但是isTypeOf
有一个预定义的类型定义,它要求它在它的参数上具有在definition
中定义的所有属性。此外,使用所有定义的参数调用该函数,以及一些额外的参数,例如kind
。我没有遇到调用者类型错误的问题,因为它来自 lib 端,但我希望能够对所有已定义的属性以及一些其他属性进行类型检查,例如 kind
函数内的 isTypeOf
.
我不明白。给我们更多您需要的代码示例。对我来说,这暂时回答了你的问题:(你的函数的输出类型是什么?你想在那里输入什么?
isTypeOf
必须匹配 function(data: (auto-generated-type) : boolean
的定义。该库将definition
上定义的所有值以及一些额外的东西发送到函数。我想要的只是能够将参数类型转换为定义的属性+一些附加属性。您的解决方案在第一个示例中失败,因为它与 isTypeOf
定义不匹配,第二个与问题无关。
您可以编辑 (auto-generated-type)
的内容吗?你可以做例如 generatedType: ... & kind: string
以上是关于获取打字稿默认/初始参数类型以扩展它的主要内容,如果未能解决你的问题,请参考以下文章