有条件申请?每个属性的映射类型中的修饰符
Posted
技术标签:
【中文标题】有条件申请?每个属性的映射类型中的修饰符【英文标题】:Conditionally apply ? modifier in mapped type per-property 【发布时间】:2021-05-16 00:50:30 【问题描述】:来自 TypeScript 文档:
// Removes 'optional' attributes from a type's properties
type Concrete<Type> =
[Property in keyof Type]-?: Type[Property];
;
type MaybeUser =
id: string;
name?: string;
age?: number;
;
我知道我可以将?
修饰符添加到所有 属性,如果我想基于extends
表达式逐个属性添加它怎么办?
类似这样的行为:
// Not valid TypeScript
type Optionalize<T> =
[P in keyof T](?: T[P] extends SomeInterface): T[P];
【问题讨论】:
这能回答你的问题吗? Typescript mapped type, add optional modifier conditionally 我原以为它没有,但更好地阅读它可能是。 确实有,但不完全 【参考方案1】:相关 GitHub 问题:https://github.com/microsoft/TypeScript/issues/32562
-
提取一个类型中不匹配的props,我们称之为
NonMatching
提取第二种类型的匹配道具,比如Matching
使用extends infer
技术将这两种类型相交
type TestType =
a: SomeInterface;
b: string;
;
type Intersection<A, B> = A & B extends infer U
? [P in keyof U]: U[P]
: never;
type Matching<T, SomeInterface> =
[K in keyof T]: T[K] extends SomeInterface ? K : never;
[keyof T];
type NonMatching<T, SomeInterface> =
[K in keyof T]: T[K] extends SomeInterface ? never : K;
[keyof T];
type DesiredOutcome = Intersection<
Partial<Pick<TestType, Matching<TestType, SomeInterface>>>,
Required<Pick<TestType, NonMatching<TestType, SomeInterface>>
>
[K in keyof T]: T[K] extends SomeInterface ? K : never
这是一种将每个匹配键映射到它自己的字符串文字类型表示的解决方法,即给定 a: never, b: SomeInterface
,你得到 b: 'b'
,然后使用indexed access types你得到字符串文字类型联合形式的匹配属性
【讨论】:
以上是关于有条件申请?每个属性的映射类型中的修饰符的主要内容,如果未能解决你的问题,请参考以下文章