First of all, you need to make PropsInterface all properties nullable.
export enum SomePropetries {
prop1,
prop2,
prop3
};
interface PropsBase {
[SomePropetries.prop1]: number;
[SomePropetries.prop2]: boolean;
[SomePropetries.prop3]: string;
}
type NullableRecord<T> = {
[Prop in keyof T]: T[Prop] | null
}
type PropsInterface = NullableRecord<PropsBase>
Then, you are allowed to use null as a property type.
let props: PropsInterface = {
[SomePropetries.prop1]: null,
[SomePropetries.prop2]: null,
[SomePropetries.prop3]: null
}
This does not work,
const fieldToUpdate = {
field: SomePropetries.prop1,
value: 123
}
props[fieldToUpdate.field] = fieldToUpdate.value;
because fieldToUpdate.field is infered as enum. I mean it expect all possible enum keys, whereas you are interested in only one SomePropetries.prop1.
Hence, in order to make it work, you should just use as const assertion.
const fieldToUpdate = {
field: SomePropetries.prop1,
value: 123
} as const
props[fieldToUpdate.field] = fieldToUpdate.value;
Whole code:
export enum SomePropetries {
prop1,
prop2,
prop3
};
interface PropsBase {
[SomePropetries.prop1]: number;
[SomePropetries.prop2]: boolean;
[SomePropetries.prop3]: string;
}
type NullableRecord<T> = {
[Prop in keyof T]: T[Prop] | null
}
type PropsInterface = NullableRecord<PropsBase>
// Usage exanple.
// I have object of properties. Each of property can be updated separatelly.
let props: PropsInterface = {
[SomePropetries.prop1]: null,
[SomePropetries.prop2]: null,
[SomePropetries.prop3]: null
};
const fieldToUpdate = {
field: SomePropetries.prop1,
value: 123
} as const
props[fieldToUpdate.field] = fieldToUpdate.value;
Playground
let fieldToUpdate {andfield: Properties = Properties.prop1,is not valid syntax