【问题标题】:Type for a function that receives an array and returns a single element of that array?类型为接收数组并返回该数组的单个元素的函数?
【发布时间】:2023-04-07 22:17:02
【问题描述】:

我有这个函数应该返回一个数组的随机项。

function getRandomArrayItem {
  return arr[Math.floor((Math.random()*arr.length))];
}

我将按如下方式使用它:

const LANGUAGE_VALUES = ["EN","ES"] as const;

// I HAVE THIS TYPE
type LANGUAGE_VALUES_TYPE = typeof LANGUAGE_VALUES[number];   // THIS IS: "EN" | "ES"

// I NEED TO CALL getRandomArrayItem ON LANGUAGE_VALUES TO SELECTED A RANDOM LANGUAGE:

const language = getRandomArrayItem(LANGUAGE_VALUES);

我需要随机选择的语言为LANGUAGE_VALUES_TYPE 类型。即:"EN" | "ES".

我该怎么做?

另外,我希望它是通用的,因为我将在其他类似数组中使用该函数,但内容不同。

【问题讨论】:

  • 在您的示例中,LANGUAGE_VALUES_TYPE 将是字符串类型,而不是 'EN' | 'ES',因为 LANGUAGE_VALUES 被推断为 string[]
  • @gbalduzzi 抱歉,我忘了添加const assertion。现在将添加。

标签: arrays typescript typescript-typings


【解决方案1】:

使用泛型和打字稿推断:

function getRandomArrayItem<T>(arr: T[]): T {
   return arr[Math.floor((Math.random()*arr.length))];
}

const language = getRandomArrayItem(LANGUAGE_VALUES); // Language is now type of the content of LANGUAGE_VALUES array

在您的示例中,将LANGUAGE_VALUES 转换为正确的类型有点棘手。需要先定义语言类型,再定义实际数组,如:

const VALUES_CONST = ["EN","ES"] as const;
type LANGUAGE_VALUES_TYPE = typeof VALUES_CONST[number];

const LANGUAGE_VALUES: LANGUAGE_VALUES_TYPE[] = ["EN","ES"]

const result = getRandomArrayItem<LANGUAGE_VALUES_TYPE>(LANGUAGE_VALUES)

// Result is of type 'EN' | 'ES'

或者强制强制转换:

const LANGUAGE_VALUES = ["EN","ES"] as const;
type LANGUAGE_VALUES_TYPE = typeof LANGUAGE_VALUES[number];   // THIS IS: "EN" | "ES"


const language = getRandomArrayItem(LANGUAGE_VALUES as unknown as LANGUAGE_VALUES_TYPE[]);

【讨论】:

  • 谢谢。我收到Cannot find name T。我不需要&lt;T&gt; 中的类型参数getRandomArrayItem&lt;T&gt;(arr: T[]): T 吗?
  • 呃,我的错,我忘了添加它
  • 还是不行。我收到Argument of type 'readonly ["EN", "ES"]' is not assignable to parameter of type 'unknown[]'. The type 'readonly ["EN", "ES"]' is 'readonly' and cannot be assigned to the mutable type 'unknown[]'.
  • 如果LANGUAGE_VALUES 未被声明为as const,我认为您的答案可能有效。我可能需要重构一些东西才能让它工作。
  • 是的,我只是在操场上摆弄它。使用as const,它不再是'EN' | 'ES' 的数组,而是完全 ['en', 'es'],因此它不能转换为通用T[]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-10
  • 2014-06-27
  • 2021-07-05
  • 2011-02-14
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多