Typescript:如何在对象Map器中进行类型收缩?

f4t66c6m  于 2022-12-24  发布在  TypeScript
关注(0)|答案(1)|浏览(142)

我有一个对象,其中的每个值都是一个函数,它需要一个字符串或字符串数组:

const myMapper: Record<Filter, (value: string | string[]) => string> = {
  contains: (value: string) => `do something with ${value}`,
  between: ([value1, value2]: string[]) => `something with ${value1} and ${value2}`,
};

问题是:如果我让ts知道函数中的参数可以是字符串或数组,它将抛出错误:

Type '(value: string) => string' is not assignable to type '(value: string | string[]) => string'

对于第一项,第二项出现类似错误。
如何保证在使用对象时传递正确类型的值(字符串或字符串数组)?是将unknown用于Record的第二个参数的唯一选项吗?

mrzz3bfm

mrzz3bfm1#

简单地省略显式类型注解看起来就足够了,而且也更容易。

const myMapper = {
  contains: (value: string) => `do something with ${value}`,
  between: ([value1, value2]: string[]) => `something with ${value1} and ${value2}`,
};

这样,您甚至不需要“承诺”您将传递正确类型的参数- TypeScript将首先防止您传递错误的参数(contains将只接受字符串,而between将只接受字符串数组)。

相关问题