typescript - 根据另一个类型的可选属性构造具有所需属性的新类型

标签 typescript

我有一个由具有一组属性的对象组成的接口(interface):

interface Foo {
  prop1: string,
  prop2: number,
  prop3?: boolean,
  prop4?: object
}

有没有办法构造一个新类型 Bar ,它只包含 Foo 的可选属性,但每个属性都是必需的,例如:

interface Bar {
  prop3: boolean,
  prop4: object
}

最佳答案

当然。首先记下内置的 typescript 助手类型 PickRequired 。然后,您可以构建另一个辅助类型,该类型将提取类型 T 的可选键:

type OptionalKeysOf<T> = {
    [K in keyof T]: {} extends Pick<T, K> ? K : never;
}[keyof T];

将所有这些结合起来:

type OnlyOptionalKeysToRequired<T> = Required<Pick<T, OptionalKeysOf<T>>>;

然后,当你使用它时:

type Bar = OnlyOptionalKeysToRequired<Foo>;

// Hovering that reveals:
// type Bar = {
//     prop3: boolean;
//     prop4: object;
// }

Playground Link

关于typescript - 根据另一个类型的可选属性构造具有所需属性的新类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69034939/

相关文章:

javascript - 如何将ISO8601 json转换为正常日期格式

javascript - 将字符串从 Angular 传递到 API

node.js - 如何在 Node+Typescript+VSCode 中查找缺少的 Await on Async 函数调用?

javascript - Meteor 聊天框 html 卡在字符串形式

css - 新行 '\n' 在 Typescript 中不起作用

typescript - 如何在 Typescript 函数类型中强制执行强制参数?

javascript - 带有 Firebase 数据的 Angular 应用程序 : why am I seeing data from the previous page?

typescript - Firebase Cloud Functions - 缺少 FIREBASE_CONFIG 环境变量

Angular 2 - 在执行服务之前等待 bool 值为真

angular - TS2339 : Property 'href' does not exist on type 'HTMLElement'