gpt4 book ai didi

typescript - 如何从 TypeScript 中的泛型部分构建目标对象?

转载 作者:搜寻专家 更新时间:2023-10-30 21:46:11 24 4
gpt4 key购买 nike

我正在使用 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
};

最佳答案

我认为您使用的是旧版本的 TS(在新版本中,传播表达式输入正确)。

无论如何,真正的问题是对象文字可能不是完整的 MyTarget。您的代码将允许此调用

convert({a : "" })// return value is not really MyTarget since it will not contain b

除了 cd 之外,您真正想要的是参数为 MyTarget:

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,
};
};

关于typescript - 如何从 TypeScript 中的泛型部分构建目标对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54533141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com