Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.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 - Fatal编程技术网

Arrays Typescript:具有相同项类型的字符串并集和完整数组的干式定义

Arrays Typescript:具有相同项类型的字符串并集和完整数组的干式定义,arrays,typescript,union,Arrays,Typescript,Union,如其他地方所示,例如,很容易从元组定义联合类型: 常量arr=[foo,bar]作为常量 常数项=arr的类型[编号] 不幸的是,我不能在需要项[]的地方使用arr-arr的类型是只读的[foo,bar],甚至直接类型转换也会导致typescript错误TS2352 Typescripts建议先强制转换为未知-它可以工作,但看起来很混乱,有点违背了类型安全数组常量的全部用途: 常量arr:Item[]=与Item[]一样未知的arr 除了上面的双重强制转换之外,有没有更好的方法可以将完整的选项列

如其他地方所示,例如,很容易从元组定义联合类型:

常量arr=[foo,bar]作为常量 常数项=arr的类型[编号] 不幸的是,我不能在需要项[]的地方使用arr-arr的类型是只读的[foo,bar],甚至直接类型转换也会导致typescript错误TS2352

Typescripts建议先强制转换为未知-它可以工作,但看起来很混乱,有点违背了类型安全数组常量的全部用途:

常量arr:Item[]=与Item[]一样未知的arr 除了上面的双重强制转换之外,有没有更好的方法可以将完整的选项列表同时作为Item[]和Item union type而不重复实际的选项?

您想要做的是类型不安全。给定

如果您可以在某处使用项[]时键入相同的arr,然后将其传递给接受项[]作为参数的函数,则该函数可以执行以下操作:

arrayParameter.push('foo');
这很好,因为参数仍然是项[]。但是原来的类型现在不正确了,因为变异的arr不再是常量[foo,bar],而是有3个项

如果要将数组用作常规项[],请先对其进行切片或以其他方式进行浅层复制。没有其他方法可以做到这一点,这将是类型安全的

const arr = ['foo', 'bar'] as const;
type Item = typeof arr[number];
const arrItems: Item[] = arr.slice();
您要做的是类型不安全。给定

如果您可以在某处使用项[]时键入相同的arr,然后将其传递给接受项[]作为参数的函数,则该函数可以执行以下操作:

arrayParameter.push('foo');
这很好,因为参数仍然是项[]。但是原来的类型现在不正确了,因为变异的arr不再是常量[foo,bar],而是有3个项

如果要将数组用作常规项[],请先对其进行切片或以其他方式进行浅层复制。没有其他方法可以做到这一点,这将是类型安全的

const arr = ['foo', 'bar'] as const;
type Item = typeof arr[number];
const arrItems: Item[] = arr.slice();
如果您的函数以只读字符串[]作为输入,那么您可以传递现有的arr,我知道您可能没有控件或更改函数签名,但如果有帮助,只需将其抛出即可

常量元组=['foo','bar']作为常量 函数printlnarr:只读字符串[]{ console.logarr } 打印元组 println['a','b','c'] 如果您的函数以只读字符串[]作为输入,那么您可以传递现有的arr,我知道您可能没有控件或更改函数签名,但如果有帮助,只需将其抛出即可

常量元组=['foo','bar']作为常量 函数printlnarr:只读字符串[]{ console.logarr } 打印元组 println['a','b','c']