【发布时间】:2021-06-29 20:12:14
【问题描述】:
是否可以有条件地将映射类型属性设为可选?
考虑这种类型
type Definition {
name: string,
defaultImplementation?: ImplementationType
}
以及他们的记录:
type DefinitionMap = Record<string, Definition>
我想创建一个映射类型,如果提供了输入,则该类型的实现是可选的,但如果没有,则需要映射类型的实现。
对于这样的DefinitionMap
{
foo: { name: 'x' },
bar: { name: 'y', defaultImplementation: { /*...*/ } }
}
我想要一个类似的映射类型
{
foo: ImplementationType,
bar?: ImplementationType
}
我一直在尝试使用条件并将 undefined 添加到类型中,但这不起作用。
type ImplementationMap<T extends DefinitionMap> = {
[K in keyof T]: T[K] extends { defaultImplementation: any }
? ImplementationType | undefined
: ImplementationType
}
我知道条件分支的行为符合我的要求,但添加 undefined 实际上并没有使该字段成为可选字段。
【问题讨论】: