我正尝试为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>
它使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]
我不懂Mapping类型,也不知道现在要去哪里。
答案 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中添加映射类型的改进