我正在使用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
};
Omit
版本。你现在使用的是哪个版本? - Titian Cernicova-DragomirOmit
,应该是一个无缝替换,但我还没有测试过:http://ideasintosoftware.com/typescript-advanced-tricks/ - Titian Cernicova-Dragomir