Given this code:
interface Foo{
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Foo]: number;
}
I would expect the type of Foo2
to be { one: number; two: number; }
However, instead it seems to keep the optional modifier { one?: number; two?: number; }
Is it possible to remove the optional modifier when using mapped types?
til/remove readonly and optional parameters in typescript We are adding the modifier. Similarly, we can also remove modifiers by explicitly adding a minus sign, - , in front of it, i.e., -readonly .
What does ?: mean in TypeScript? Using a question mark followed by a colon ( ?: ) means a property is optional. That said, a property can either have a value based on the type defined or its value can be undefined .
Interfaces are most recommended for defining new objects or methods or properties of an object where it will receive a specific component. Hence interface works better when using objects and method objects. Therefore it is our choice to choose between types or interface according to the program needs.
In Typescript 2.8 you can explicitly eliminate the modifier:
type Foo2 = {
[P in keyof Foo]-?: number;
}
Or use the Required
type that is built into newer versions.
If you are using an older version you can use this workaround:
type Helper<T, TNames extends string> = { [P in TNames]: (T & { [name: string]: never })[P] };
type Foo3 = Helper<Foo, keyof Foo>;
You can use Required<T>
as an alternative to -?
interface Foo {
one?: string;
two?: string;
}
type Foo2 = {
[P in keyof Required<Foo>]: number;
};
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With