首页 > 解决方案 > 如何从传递的对象数组中推断从属性中选取的值的总和类型

问题描述

我正在尝试将对象数组传递给函数。此函数必须查看其对象的一个​​属性背后的所有类型的值。这些类型的值应该作为类型参数传递给返回的函数

要达到这些结果,必须填写哪些类型的问号?

type A = { key: 'a' };
type B = { key: 'b' };
type C = { key: 'c' };

type Xs = (A | B | C)[];

const fn1 = (arg1: ???) => {
  return {
    f2: (arg2: ???) => null,
  };
};

// should fail
fn1([]).f2('a');
// should also fail
fn1([{ key: 'a' }]).f2('c');
// correct
fn1([{ key: 'a' }, { key: 'b' }]).f2('a');

类似的东西Pick<ValuesType<(A | B | C)[]>, 'key'>['key']可以用来获取"a" | "b" | "c"类型。但是如何推断形成传递数组的类型子集对我来说仍然是个难题。

标签: typescripttype-inference

解决方案


尝试这个:

const fn1 = <K extends string>(arg1: {key: K}[]) => {
  return {
    f2: (arg2: K) => null,
  };
};

游乐场链接

如果您必须将原始参数限制为仅属于类型Xs或子类型,请尝试以下操作:

const fn1 = <T extends Xs>(arg1: T) => {
  return {
    f2: (arg2: T[number]['key']) => null,
  };
};

游乐场链接


推荐阅读