【问题标题】:Infer Type of interface from Map type?从地图类型推断接口类型?
【发布时间】:2019-06-27 07:35:05
【问题描述】:

我正在尝试为旧版本的 Typescript 制作 Required 映射类型(例如 Ionic Framework 3 使用的 2.6.2)。

我到现在都有这个:

declare type MakeRequired<T, K extends string> = {
  [P in K]: string
}

declare type MyRequiredType = MakeRequired<MyInterface, keyof MyInterface>

它要求T(MyInterface) 的可选属性,但当然它会将所有这些类型转换为strings

所以

interface MyInterface {
    optional?: Function
}

结束

MyRequiredType {
   optional:string
}

有没有办法说“取T[P]的类型”?

我试过了:

[P in K]: T[K]
[P in K]: typeof T[K]
[P in K]: T[P]

我不熟悉映射类型,现在不知道该去哪里。

【问题讨论】:

  • 您的T 未被使用。有错别字?
  • 你想让T类型的所有属性都需要吗?
  • @unional 是的,我想让所有 T 属性成为必需的。这就是我注入T 的原因,因为我认为我会需要它(但我不知道如何使用它)
  • 我认为这是相似的:stackoverflow.com/questions/49655419/…
  • @TitianCernicova-Dragomir 有点像,尽管它使属性类型为 ' 类型 | undefined' 我正在寻找是否可以更改它。

标签: typescript typescript2.0


【解决方案1】:

免责声明:type-plus作者在这里。

如果你想获得一个具有T 类型中所有属性的类型,你可以使用Required&lt;T&gt; 类型中的构建。

这是Required&lt;T&gt;的类型定义:

type Required<T> = {
  [P in keyof T]-?: T[P];
};

如果要获取所需类型的特定部分,可以在type-plus中使用RequiredPick&lt;T, U&gt;RequiredExcept&lt;T, U&gt;

代码比较简单,所以我也贴在这里:

type RequiredPick<T, U extends keyof T> = Required<Pick<T, U>> & Pick<T, Exclude<keyof T, U>>

type RequiredExcept<T, U extends keyof T> = Required<Pick<T, Exclude<keyof T, U>>> & Pick<T, U>

如果您愿意,也可以使用RecursiveRequired&lt;T&gt;

更新:这需要在 TypeScript 2.8 中添加映射类型改进

【讨论】:

  • 条件类型不适用于 2.6,这是 OP 在问题中提到的目标版本 ..
  • 我明白了。它需要改进映射类型(不是条件类型),但你是对的,这需要 TS 2.8。
  • 是的,你是对的,我的错。 -? 语法是必需的(咖啡还没有出现:))
  • 这一切都很好。我不知道它需要 TS 2.8 开始。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2021-08-14
相关资源
最近更新 更多