能否有条件地使映射类型属性变为可选?
考虑以下类型:
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
实际上并没有使该字段变为可选。
type KeysMatching<T,V> = {[K in keyof T]: T[K] extends V ? K : never}[keyof T]
。它允许进行大量高级魔法。正是我所需要的! - Bence Szalai