三元数与带有部分索引的扩展内部查询类型?

时间:2019-04-16 19:09:57

标签: typescript

有人可以引导我了解这里发生的事情吗?老实说,我无法弄清楚这段代码如何导致类型声明。

type SettingsModalErrors = Partial<
  {
    [k in keyof GroupInput]: GroupInput[k] extends SomeProduct
      ? PaywallSettingsErrors
      : DefaultError
  }
> 

2 个答案:

答案 0 :(得分:2)

三元是conditional type

因此要分解此类型声明:

  • type SettingsModalErrors =type alias,因此SettingsModalErrors可以在其他地方作为类型引用。
  • Partial<>是内置的mapped type,使输入类型具有所有可选字段。因此Partial<{ a: string }>成为{ a?: string }
  • { }是内联结构类型定义。
  • [k in keyof GroupInput]mapped type(与index type signature类似但不相同),它表示GroupInput的所有键都是结果类型的键。因此,如果GroupInput{ text: string },则[k in keyof GroupInput]: number的结果为{ text: number }
  • GroupInput[k]index type query,使用映射键中的kGroupInput类型上查找该键的类型。因此,换句话说,{ [k in keyof GroupInput]: GroupInput[k] }产生的类型实际上与GroupInput相同。
  • GroupInput[k] extends SomeProduct ? PaywallSettingsErrors : DefaultErrorconditional type,其运行方式与本机JS三元语句相同。这意味着如果可以将GroupInput[k]的类型分配给SomeProduct,则将类型(在这种情况下为生成的映射类型的键)设为PaywallSettingsErrors,否则将类型设为{ {1}}。仅由条件类型本身定义的就是单一类型。在映射类型表达式的右侧使用,因为在这种情况下,它被应用于映射类型的每个键。

the playground中的示例。

给出以下类型:

DefaultError

如果然后运行您描述的代码:

type SomeProduct = { product: string };

type PaywallSettingsErrors = { errors: any };

type DefaultError = { error: any };

type GroupInput = {
    foo: SomeProduct;
    bar: number;
}

然后,type SettingsModalErrors = Partial< { [k in keyof GroupInput]: GroupInput[k] extends SomeProduct ? PaywallSettingsErrors : DefaultError } > 的结果类型为:

SettingsModalErrors

type SettingsModalErrors = { foo?: PaywallSettingsErrors; bar?: DefaultError; } 得益于?,键Partial<>foo得益于映射类型bar和类型{{1}这些键上的}和[k in keyof GroupInput]多亏了条件类型表达式。

答案 1 :(得分:1)

type SettingsModalErrors = Partial<

它创建一个具有所有可选属性的类型

{
    [k in keyof GroupInput]: 

和属性名称与GroupInput类型中的

相同
           GroupInput[k] extends SomeProduct
       ? PaywallSettingsErrors
       : DefaultError

和属性类型取决于相应的GroupInput属性的类型。如果它是SomeProductSomeProduct的子类型,则属性类型为PaywallSettingsErrors,否则属性类型为DefaultError

  

此代码如何导致类型声明

它以mapped type开头,通常类似于

{[k in keyof SomeType]: SomePropertyType}

在您的情况下,SomePropertyTypeconditional type,它取决于GroupInput[k]kGroupInput中名为k的一种属性,其中{{ 1}}遍历keyof GroupInput中的所有属性名称。

然后用内置的Partial类型包装。