考虑以下代码:
interface Foo{
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Foo]: number;
}
我本以为Foo2
的类型是{ one: number; two: number; }
,然而它似乎仍保留了可选修饰符{ one?: number; two?: number; }
在使用映射类型时是否有可能去掉可选修饰符?
考虑以下代码:
interface Foo{
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Foo]: number;
}
我本以为Foo2
的类型是{ one: number; two: number; }
,然而它似乎仍保留了可选修饰符{ one?: number; two?: number; }
在使用映射类型时是否有可能去掉可选修饰符?
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>;
我写了一篇关于映射类型的中等难度文章,你可能会发现它很有趣:这里
自 TypeScript 2.8 版本以来,您基本上可以使用 Required 实用程序类型。
interface Foo{
one?: string;
two?: string;
}
type Foo2 = Required<Foo>
在这种情况下,即使“one”和“two”是不同的类型,你也不需要担心它