有条件申请?每个属性的映射类型中的修饰符

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你得到字符串文字类型联合形式的匹配属性

【讨论】:

以上是关于有条件申请?每个属性的映射类型中的修饰符的主要内容,如果未能解决你的问题,请参考以下文章

c#类的修饰符都有哪些?

映射类型:删除可选修饰符

Angular 无法编译 Typescript 的映射类型修饰符

OC类属性了解一下-class作为属性修饰符

如何:使用条件自定义背景视图作为背景修饰符?

Java类成员之属性