gpt4 book ai didi

typescript - 在 typescript 中选择一种交叉类型

转载 作者:行者123 更新时间:2023-12-04 09:33:11 25 4
gpt4 key购买 nike

我发现自己处于以下情况:

有一个 A 类型的变量,我将它传递给一个返回 A & B 类型值的 API。然后,我必须将此返回值发布到一个 HTTP 端点,该端点需要 A 类型的有效负载。

interface A {
name: string;
}

interface B {
type: string;
}

function api(arg: A): A & B {
return { name: arg.name, type: 'Blah' };
}

const x: A = { name: 'Foo' };

const y: A & B = api(x);

const z: A = y;

// Simulate HTTP call with payload z of type A
console.log(JSON.stringify(z));

输出是 {"name":"Foo","type":"Blah"}。尽管 zA 类型,但有效负载仍包含 B 的字段。

如何删除其中一种交集类型 (B) 并仅保留类型 A 以便输出为 {"name":"Foo"}

最佳答案

Titian explained这很好,但不幸的是接口(interface)是编译时组件而不是运行时组件,所以这些情况很难解释。使用他们的解决方案,您可以根据自己的情况调整它以获得类似的东西

function extract<T>(properties: Record<keyof T, true>) {
return function <TActual extends T>(value: TActual): T {
const result = {} as T;
for (const property of Object.keys(properties) as Array<keyof T>) {
result[property] = value[property];
}
return result;
};
}

const extractA = extract<A>({
name: true,
});

// { name: 'Foo' }
console.log(extractA(z));

关于typescript - 在 typescript 中选择一种交叉类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62735076/

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