【发布时间】:2019-10-13 04:57:19
【问题描述】:
我正在为我无法控制的库编写类型声明文件。其中一种方法接受字符串数组作为参数,但这些字符串只能是非常具体的值。目前我将此参数输入为string[],但我想知道是否有办法增强它以包含特定值。
示例来源(我无法更改):
Fruits(filter) {
for (let fruit of filter.fruits)
{
switch(fruit)
{
case 'Apple':
...do stuff
case 'Pear':
...do stuff
default:
console.error('Invalid Fruit');
return false;
}
}
return true;
}
我当前的类型声明:
function Fruits(filter: FruitFilter): boolean;
interface FruitFilter {
fruits: string[];
}
在我写这个问题时,我想出了一个部分解决方案,方法是定义一个有效字符串的联合类型,然后将字段的类型设置为该联合的数组而不是字符串数组。这给了我想要的检查,但我注意到如果输入无效字符串,它会将数组中的所有字符串标记为无效,并出现错误Type 'string' is not assignable to type 'Fruit'。有没有更好的方法来做到这一点,以便只有违规字符串被标记为无效,或者这与我将得到的一样接近?
部分解决方案:
function Fruits(filter: FruitFilter): boolean;
type Fruit = 'Apple' | 'Pear'
interface FruitFilter {
fruits: Fruit[];
}
【问题讨论】:
-
为了简短地回答您的问题,鉴于当前的 TS 功能,您已经有了最佳解决方案。
-
@Nit 不是重复的,因为这是专门讨论限制数组中的值,而不是该问题所询问的字符串字段。
-
问题和答案是一样的,一个是直接输入
foo,另一个是输入foo[]。 -
我承认,鉴于 TypeScript 的当前功能,解决方案可能是相同的,但问题的主题是根本不同的。也就是说,解决方案仍然没有报告正确的错误,导致我在问题底部的最终查询。
标签: arrays typescript union-types type-declaration