映射类型:删除可选修饰符
Mapped Types: removing optional modifier
鉴于此代码:
interface Foo{
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Foo]: number;
}
我希望 Foo2
的类型是 { one: number; two: number; }
但是,它似乎保留了可选修饰符 { one?: number; two?: number; }
使用映射类型时是否可以删除可选修饰符?
在 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>;
您可以使用 Required<T>
替代 -?
interface Foo {
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Required<Foo>]: number;
};
我可能会构建自己的实用程序
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,您会觉得有趣:)
从 typescript 2.8 开始你基本上可以使用 Required utility type
interface Foo{
one?: string;
two?: string;
}
type Foo2 = Required<Foo>
在这种情况下,即使 'one' 和 'two' 是不同的类型,您也不必担心
鉴于此代码:
interface Foo{
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Foo]: number;
}
我希望 Foo2
的类型是 { one: number; two: number; }
但是,它似乎保留了可选修饰符 { one?: number; two?: number; }
使用映射类型时是否可以删除可选修饰符?
在 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>;
您可以使用 Required<T>
替代 -?
interface Foo {
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Required<Foo>]: number;
};
我可能会构建自己的实用程序
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,您会觉得有趣:)
从 typescript 2.8 开始你基本上可以使用 Required utility type
interface Foo{
one?: string;
two?: string;
}
type Foo2 = Required<Foo>
在这种情况下,即使 'one' 和 'two' 是不同的类型,您也不必担心