从Map类型推断接口类型?

时间:2019-02-03 08:49:20

标签: typescript typescript2.0

我正尝试为Typescript的较早版本(例如Ionic Framework 3使用的2.6.2)创建Required映射类型。

直到现在我都拥有这个:

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

declare type MyRequiredType = MakeRequired<MyInterface, keyof MyInterface>

它使TMyInterface)的可选属性成为必需,但是当然它将所有类型转换为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]

我不懂Mapping类型,也不知道现在要去哪里。

1 个答案:

答案 0 :(得分:0)

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

如果要获取具有所有类型为T的属性的类型,则可以使用Required<T>类型的构建。

这是Required<T>的类型定义:

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

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

代码非常简单,因此我也将其发布在这里:

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<T>

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