Например, возьмем этот интерфейс:
interface SomeObject {
prop1: number;
prop2: string;
prop3: {
innerProp1: number[];
innerProp2: string[];
innerProp3: {
deeperProp1: string[];
deeperprop2: boolean;
},
innerProp4: {
[key: string]: any;
},
innerProp5: {
[key: string]: any;
}
}
}
Я хочу создать тип, который принимает форму любого объекта, затем возвращает ту же форму объекта, но с предоставленным типом для свойств «листа» и каждое свойство объекта может быть необязательным. Что-то похожее на приведенное ниже:
type ModifyShapeType<Shape, NewType> = ???
Так, что при использовании, например, с интерфейсом выше, я получу безопасность типов для той же формы объекта, но с предоставленным типом:
const myObject: ModifyShapeType<SomeObject, boolean> = {
prop1: true;
prop2: true;
prop3: {
// innerProp1: true;
// innerProp2: false;
innerProp3: {
deeperProp1: true;
// deeperprop2: true;
},
innerProp4: true,
// innerProp5: false
}
};
Я придумал тот, что ниже, но я хочу избавиться от исходных типов из фигуры и заменить его тем, что я хочу, и, если возможно, сохранить специфичность при чтении и записи свойств.
type ModifyShapeType<S, T> = Partial<Record<keyof S, Partial<S[keyof S] | T>>>;
Вот TypeScript Playground .
Предостережения в настоящее время:
- Типы, все еще выводимые из исходного типа объекта, фактически это теперь все mixed.
- Все свойства теперь имеют один и тот же тип (специфичность при потере чтения), что также означает небезопасные записи (специфичность при потере записи)
Возможно ли это?