typescript 联合类型上不存在联合属性

xa9qqrwz  于 2023-03-04  发布在  TypeScript
关注(0)|答案(2)|浏览(145)

我在TypeScript中遇到以下问题:

type Foo = {
  a: number
}

type Bar = {
  b: number
}

type Props = {
  object?: Foo | Bar | null;
  keys?: (keyof Foo)[] | (keyof Bar)[];
}

function myFunction({ object, keys = ['a'] }: Props) {
  const values = keys.map(key => object && object[key]);
  // Element implicitly has an 'any' type because expression of type '"a" | "b"' can't be used to index type 'Foo | Bar'.
  // Property 'b' does not exist on type 'Foo | Bar'.
}

在这种情况下,输入可以是Foo类型,也可以是Bar类型,那么如何编写类型呢?
我试图构建一个抽象,它可以接收两个对象和从这些对象中选择的键。传入的对象可以是类型A或类型C。它们可以有无限个键,但调用者必须传入与传入的对象匹配的键。

j5fpnvbx

j5fpnvbx1#

Props是坏的,因为它是,你没有区分FooBar的 prop 。
您可以使用泛型

type Props<T> = {
  object?: T | null;
  keys?: (keyof T)[];
};

function myFunction<T extends Foo | Bar>({ object, keys = ['a'] as (keyof T)[] }: Props<T>) {
  const values = keys.map(key => object && object[key]);
}

现在我留下了null和可选输入,但是如果您打算从这个函数返回一些东西,我强烈建议您收紧您的API,否则用户将不得不进行各种检查

7d7tgy0s

7d7tgy0s2#

我建议歧视性婚姻。

type Foo = {
 kind: "foo";
 a: number
}

type Bar = {
  kind: "bar";
  b: number
}

type Props = Foo | Bar;

function myFunction(props: Props) {
  const value = props.kind == "foo"? props.a : props.b;
}

相关问题