Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typescript/9.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
Typescript 使用字符串文字数组作为类型_Typescript_Class Validator - Fatal编程技术网

Typescript 使用字符串文字数组作为类型

Typescript 使用字符串文字数组作为类型,typescript,class-validator,Typescript,Class Validator,我想使用单个数组constfruits=['banana'、'apple'、'orange']作为普通数组和类型 我应该能够做到这一点: const x:fruits/=>只接受“香蕉”、“苹果”或“橙色” 并且能够做到这一点: @IsIn(水果) 我已尝试将数组声明为,例如: const fruits=['香蕉'、'苹果'、'橘子'] type Fruits=typeof Fruits[number]//计算结果为类型:“香蕉”|“苹果”|“橙色” 但是@IsIn(水果)将返回以下错误:

我想使用单个数组
constfruits=['banana'、'apple'、'orange']
作为普通数组和
类型

我应该能够做到这一点:
const x:fruits/=>只接受“香蕉”、“苹果”或“橙色”

并且能够做到这一点:
@IsIn(水果)


我已尝试将数组声明为
,例如:

const fruits=['香蕉'、'苹果'、'橘子']
type Fruits=typeof Fruits[number]//计算结果为类型:“香蕉”|“苹果”|“橙色”
但是
@IsIn(水果)
将返回以下错误:

Argument of type 'readonly ["banana", "apple", "orange"]' is not assignable to parameter of type 'any[]'.
  The type 'readonly ["banana", "apple", "orange"]' is 'readonly' and cannot be assigned to the mutable type 'any[]'.ts(2345)
所以我想如果我创建了两个数组,一个普通数组和一个只读数组,它应该可以工作。所以我试了一下:

const fruits=['香蕉'、'苹果'、'橘子']
const FROUTS_readonly:[…FROUTS]
水果类型=水果类型\u只读[数量]
但是现在
Fruits
evalute到
type:string
而不是
type:“banana”|“apple”|“orange”

的确,使用
readonly
元素生成对象和数组。如果您想获得
const
断言为您带来的字符串文字和元组类型的好处,同时还可以取消对结果的只读操作,那么您可以编写一个帮助函数来实现这一点。我将其称为
mutable()

对上述情况也是如此

const alsoFruits = deepMutable(['banana', 'apple', 'orange'] as const);
// const alsoFruits: ["banana", "apple", "orange"]
但对于嵌套对象,这种区别变得很重要:

const readonlyDeepFruits = {
    yellow: ["banana", "lemon"],
    red: ["cherry", "apple"],
    orange: ["orange", "mango"],
    green: ["lime", "watermelon"]
} as const;
/* const readonlyDeepFruits: {
    readonly yellow: readonly ["banana", "lemon"];
    readonly red: readonly ["cherry", "apple"];
    readonly orange: readonly ["orange", "mango"];
    readonly green: readonly ["lime", "watermelon"];
} */

const partiallyMutableDeepFruits = mutable(readonlyDeepFruits);
/* const partiallyMutableDeepFruits: {
    yellow: readonly ["banana", "lemon"];
    red: readonly ["cherry", "apple"];
    orange: readonly ["orange", "mango"];
    green: readonly ["lime", "watermelon"];
} */

const fullyMutableDeepFruits = deepMutable(readonlyDeepFruits);
/* const fullyMutableDeepFruits: {
    yellow: ["banana", "lemon"];
    red: ["cherry", "apple"];
    orange: ["orange", "mango"];
    green: ["lime", "watermelon"];
} */
好的,希望能有帮助。祝你好运


谢谢,这有用:)但我还是不明白为什么
typeof fruits\u readonly[number]
的计算结果不是
type:“香蕉”|“苹果”|“橙色”
。请你给我解释一下好吗?哦,对不起。。。在
const fruits=['banana'、'apple'、'orange']
中,
fruits
被推断为类型
string[]
,因此编译器已经忘记了传递给它的特定字符串的标识。所以
[…水果]
也将是
字符串[]
。如果你想让编译器记住
“香蕉”|“苹果”|“橙色”
,你需要告诉它不要在信息还在的时候扔掉信息。。。这就是const所做的(除其他外)。
const alsoFruits = deepMutable(['banana', 'apple', 'orange'] as const);
// const alsoFruits: ["banana", "apple", "orange"]
const readonlyDeepFruits = {
    yellow: ["banana", "lemon"],
    red: ["cherry", "apple"],
    orange: ["orange", "mango"],
    green: ["lime", "watermelon"]
} as const;
/* const readonlyDeepFruits: {
    readonly yellow: readonly ["banana", "lemon"];
    readonly red: readonly ["cherry", "apple"];
    readonly orange: readonly ["orange", "mango"];
    readonly green: readonly ["lime", "watermelon"];
} */

const partiallyMutableDeepFruits = mutable(readonlyDeepFruits);
/* const partiallyMutableDeepFruits: {
    yellow: readonly ["banana", "lemon"];
    red: readonly ["cherry", "apple"];
    orange: readonly ["orange", "mango"];
    green: readonly ["lime", "watermelon"];
} */

const fullyMutableDeepFruits = deepMutable(readonlyDeepFruits);
/* const fullyMutableDeepFruits: {
    yellow: ["banana", "lemon"];
    red: ["cherry", "apple"];
    orange: ["orange", "mango"];
    green: ["lime", "watermelon"];
} */