有人可以引导我了解这里发生的事情吗?老实说,我无法弄清楚这段代码如何导致类型声明。
type SettingsModalErrors = Partial<
{
[k in keyof GroupInput]: GroupInput[k] extends SomeProduct
? PaywallSettingsErrors
: DefaultError
}
>
答案 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,使用映射键中的k
在GroupInput
类型上查找该键的类型。因此,换句话说,{ [k in keyof GroupInput]: GroupInput[k] }
产生的类型实际上与GroupInput
相同。GroupInput[k] extends SomeProduct ? PaywallSettingsErrors : DefaultError
是conditional 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
属性的类型。如果它是SomeProduct
或SomeProduct
的子类型,则属性类型为PaywallSettingsErrors
,否则属性类型为DefaultError
。
此代码如何导致类型声明
它以mapped type开头,通常类似于
{[k in keyof SomeType]: SomePropertyType}
在您的情况下,SomePropertyType
是conditional type,它取决于GroupInput[k]
,k
是GroupInput
中名为k
的一种属性,其中{{ 1}}遍历keyof GroupInput
中的所有属性名称。
然后用内置的Partial类型包装。