鉴于此代码:
select
我希望interface Foo{
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Foo]: number;
}
的类型为Foo2
但是,它似乎保留了可选修饰符{ one: number; two: number; }
使用映射类型时是否可以删除可选修饰符?
答案 0 :(得分:14)
在Typescript 2.8中,您可以明确地消除修饰符:
type Foo2 = {
[P in keyof Foo]-?: number;
}
或使用内置于较新版本的Required
类型。
如果您使用的是旧版本,则可以使用此解决方法:
type Helper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P] };
type Foo3 = Helper<Foo, keyof Foo>;
答案 1 :(得分:4)
您可以使用Required<T>
代替-?
interface Foo {
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Required<Foo>]: number;
};
答案 2 :(得分:1)
我可能会构建自己的实用程序
interface Foo {
one?: string;
two?: string;
}
type RequiredWithType<T, V> = {
[P in keyof T]-?: V;
}
// and then just use it
type Foo2 = RequiredWithType<Foo, Number>;
我已经写了一篇关于映射类型的中等文章 here,你认为它很有趣:)