获取打字稿默认/初始参数类型以扩展它

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 ,但我的实际代码包含更复杂的对象,我将失去自动生成的打字内容的所有好处。

我有什么方法可以内联扩展匿名类型的参数吗?我在想类似 initialdefault 关键字来获取参数自己的类型,并像这样使用它:

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: ... &amp; kind: string

以上是关于获取打字稿默认/初始参数类型以扩展它的主要内容,如果未能解决你的问题,请参考以下文章

打字稿:在没有实际扩展/扩大的情况下捕获/推断类型的约束

具有默认参数值的打字稿条件返回类型

扩展排他联合的打字稿通用参数

打字稿泛型:从函数参数的类型推断类型?

在打字稿中将枚举类型作为参数传递

映射打字稿参数:绑定元素“列”隐式具有“任何”类型