在Typescript中,选择一种交叉类型。

3

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

有一个类型为 A 的变量,我将其传递给一个API,该API返回一个类型为A & B的值。然后,我必须将此返回的值发送到一个期望类型为A的负载的HTTP端点。

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"}。尽管z的类型是A,但有效载荷仍然包含B的字段。
如何删除交集类型之一(B),只保留类型A,以便输出为{"name":"Foo"}
1个回答

2

Titian解释得很好,但不幸的是接口是编译时组件而不是运行时组件,因此这些情况可能很难处理。使用他们的解决方案,您可以根据自己的情况进行调整,以获得类似以下内容的结果

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));

1
感谢您的答案,@jpthesolver2。我知道我必须创建一个副本,因为接口是编译时组件,但我不知道有这样一种优雅且可维护的方法来做到这一点。 - Tasos P.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接