我正在使用[email protected]。我有一个目标对象: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}; 最佳答案 我认为您使用的是较旧版本的ts(在较新版本中,已正确键入扩展表达式)。不管怎样,真正的问题是对象文字可能不是完整的 cc >。您的代码将允许此调用convert({a : "" })// return value is not really MyTarget since it will not contain b您真正想要的是参数MyTarget,除了MyTarget和c:interface MyTarget { a: string; b: string; c: string; d: string;}type Omit<T, K extends keyof T> = Pick<T, Exclude<keyof T, K>>const convert = (t: Omit<MyTarget, 'c' | 'd'>) : MyTarget => { return { c: "c", d: "d", ...t, };};
07-24 09:17