Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 如何键入Typescript数组以仅接受一组特定的值?_Arrays_Typescript_Union Types_Type Declaration - Fatal编程技术网

Arrays 如何键入Typescript数组以仅接受一组特定的值?

Arrays 如何键入Typescript数组以仅接受一组特定的值?,arrays,typescript,union-types,type-declaration,Arrays,Typescript,Union Types,Type Declaration,我正在为我不控制的库编写类型声明文件。其中一个方法接受字符串数组作为参数,但这些字符串只能是非常特定的值。目前,我正在以字符串[]的形式键入此参数,但我想知道是否有一种方法可以将此参数增强为包含特定值 示例来源(我无法更改): 我当前的类型声明: function Fruits(filter: FruitFilter): boolean; interface FruitFilter { fruits: string[]; } 在我写这个问题时,我提出了一个部分解决方案,定义了一个有效

我正在为我不控制的库编写类型声明文件。其中一个方法接受字符串数组作为参数,但这些字符串只能是非常特定的值。目前,我正在以
字符串[]
的形式键入此参数,但我想知道是否有一种方法可以将此参数增强为包含特定值

示例来源(我无法更改):

我当前的类型声明:

function Fruits(filter: FruitFilter): boolean;

interface FruitFilter {
    fruits: string[];
}
在我写这个问题时,我提出了一个部分解决方案,定义了一个有效字符串的并集类型,然后将字段的类型设置为该并集的数组,而不是字符串数组。这给了我想要的检查,但我注意到,如果您输入一个无效字符串,它会将数组中的所有字符串标记为无效,并出现错误
Type'string'不可分配给Type'Fruit'
。有没有更好的方法来这样做,只有有问题的字符串被标记为无效,或者这是我将得到的最接近的结果

部分解决方案:

function Fruits(filter: FruitFilter): boolean;

type Fruit = 'Apple' | 'Pear'

interface FruitFilter {
    fruits: Fruit[];
}

所以,你的问题似乎是:

type Fruit = "Apple" | "Pear";
interface FruitFilter {
  fruits: Fruit[];
}
declare function Fruits(filter: FruitFilter): boolean;
Fruits({ fruits: ["Apple", "Apple", "Pear"] }); // okay
Fruits({ fruits: ["Apple", "App1e", "Pear"] }); // error
// actual error: ~~~~~~~  ~~~~~~~  ~~~~~~ <-- string not assignable to Fruit
// expected error:        ~~~~~~~ <-- "App1e" not assignable to Fruit
type Fruit=“Apple”|“Pear”;
接口滤波器{
水果:水果[];;
}
声明函数水果(过滤器:水果过滤器):布尔值;
水果({水果:[“苹果”、“苹果”、“梨”]});//可以
水果({水果:[“苹果”、“苹果”、“梨”]});//错误

//实际错误:~~~~~~~~~~~~~~~~~~~~您也可以使用枚举:

enum Fruits {
    Apple = 'Apple',
    Pear = 'Pear',
}
TypeScript文档还有一些示例,以及如何在运行时使用这些示例:


的可能重复要简短回答您的问题,您已经有了当前TS功能的最佳解决方案。@这不是重复,因为这是专门讨论限制数组中的值,而不是该问题所要求的字符串字段。问题和解决方案是相同的,一种是简单地键入
foo
,另一种是键入
foo[]
。考虑到TypeScript当前的功能,我承认解决方案可能是相同的,但问题的主题根本不同。也就是说,解决方案仍然没有报告正确的错误,导致我在问题的底部进行最后的查询。
// You might also use Enums for that:

enum Fruits {
    Apple,
    Pear,
}

interface FruitFilter {
    fruits: Array<Fruits>;
}
enum Fruits {
    Apple = 'Apple',
    Pear = 'Pear',
}