Мы просто говорим о вещах на уровне типов, а не о поведении во время выполнения.Вы можете использовать условные типы внутри вашего сопоставленного типа для выполнения проверки.Вот заменитель общего свойства:
type ReplaceProps<T, From, To> = { [K in keyof T]:
K extends keyof From ? T[K] extends From[K] ? K extends keyof To ? To[K]
: T[K] : T[K] : T[K]
}
Идея состоит в том, что любое свойство в T
, ключ и тип значения которого также найдены в From
, а ключ находится в To
, будет заменено натип недвижимости в To
;в противном случае оно оставляет свойство в покое.
Затем вы можете использовать его следующим образом:
type IInputObjectOut = ReplaceProps<IInputObject, IFactoryConfig, IFactoryResult>;
и, осмотрев IInputObjectOut
, вы увидите, что оно соответствует вашему желаемому типу:
type IInputObjectOut = {
baz: (otherParam: number) => void;
notPredefined: string;
aNumber: number;
foo: (someParam: string) => boolean;
aMethod: () => void;
}
Я думаю, вы можете определить свой тип IFactory
следующим образом, предполагая, что он должен вызываться и ведет себя как ReplaceProps
для своего типа ввода:
interface IFactory {
<T>(config: T): ReplaceProps<T, IFactoryConfig, IFactoryResult>;
}
declare const iFact: IFactory;
declare const input: IInputObject;
input.foo; // string
input.aNumber; // number
const output = iFact(input); // ReplaceProps<IInputObject, IFactoryConfig, IFactoryResult>;
output.foo("hey"); // boolean
output.aNumber; // number
Делает ли эторабота для тебя?Надеюсь, поможет.Удачи!