Я использую typescript@2.3.4.
У меня есть целевой объект:
interface MyTarget {
a: string;
b: string;
c: string;
d: string;
}
Я хочу создать несколько преобразований частичных объектов с использованием шаблонов.
Один такой конвертер может выглядеть следующим образом:
const convert = <T extends object>(t: T): MyTarget => {
return {
c: "c",
d: "d",
...t,
};
};
Тем не менее это приводит к:
error TS2698: Spread types may only be created from object types.
, хотя я и охраняю общий T
как object
.
Затем я помню, что существует тип Partial
, поэтому я попробовал это:
const convert = (partial: Partial<MyTarget>): MyTarget => {
return {
c: "c",
d: "d",
...partial,
};
};
И все же Partial
делает все свойства необязательными.Я не хочу этого, и теперь будет выдано:
src/Partial.ts(14,5): error TS2322: Type '{ a?: string; b?: string; c: string; d: string; }' is not assignable to type 'MyTarget'.
Property 'a' is optional in type '{ a?: string; b?: string; c: string; d: string; }' but required in type 'MyTarget'.
Я хочу создать экземпляр MyTarget
с каждым полем, установленным как требование.Я хочу сохранить безопасность типов, вот почему я не хочу этого, даже если это работает:
const convert = (partial: Partial<MyTarget>): MyTarget => {
return {
c: "c",
d: "d",
...partial,
} as MyTarget; // loses type checks, really don't want to
};