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 - Fatal编程技术网

确保数组/集合具有Typescript中字符串并集的所有值

确保数组/集合具有Typescript中字符串并集的所有值,typescript,Typescript,我想要一个数组或一组值,保证所有值都是字符串并集。我知道我可以做相反的事情,但在我的例子中,类型来自一个库 假设你有一个给定的字符串的并集 A型=‘foo’|‘bar’ 现在,您需要创建一个数组或集合,该数组或集合的所有字符串并集的值不多也不少 常数a=['foo','bar'];应该通过,因为它具有所有值 常数a=['foo'];应失败,因为缺少“条” 常数a=['foo','bar','baz'];应该失败,因为baz不是有效的a。这个很简单:const a:a[]=['foo','bar'

我想要一个数组或一组值,保证所有值都是字符串并集。我知道我可以做相反的事情,但在我的例子中,类型来自一个库

假设你有一个给定的字符串的并集

A型=‘foo’|‘bar’

现在,您需要创建一个数组或集合,该数组或集合的所有字符串并集的值不多也不少

常数a=['foo','bar'];应该通过,因为它具有所有值

常数a=['foo'];应失败,因为缺少“条”

常数a=['foo','bar','baz'];应该失败,因为baz不是有效的a。这个很简单:const a:a[]=['foo','bar','baz']

由于类型信息在运行时丢失,我知道我必须手动列出键,但我同意这一点

我知道一个技巧,它适用于对象,但我希望有类似于数组或集合的东西

type Flag<S extends string> = {[K in S]: 1};
const a = Flag<A> = {
  foo: 1,
  bar: 1
}
编辑:下面是有关Typescript的一个相关问题:

这段代码将并集的置换生成为元组的并集。 你可以用它来解决你的问题,就像这样

type PermutationsOfA = UnionToTuple<A>; // ["foo", "bar"] | ["bar", "foo"]

const test: PermutationsOfA = ["foo", "bar"] // pass
const test1: PermutationsOfA = ["bar", "foo"] // pass
const test2: PermutationsOfA = ["bar", "foo", "baz"] // fail
const test3: PermutationsOfA = ["foo"] // fail
UnionToTuple的排列可以适应通常会破坏UnionToTuple的非排列的更改,例如Typescripts内部ID系统更改联合的顺序


如果这有帮助,请告诉我

您正在寻找UnionToTuple,您可能会找到它。不要用它!它是不受支持的,并且以有趣的方式被破坏,因为构建之间的联合顺序可能不一致。因此,短篇小说坚持使用对象解决方法。^UnionToTuple是不可靠的,因为联合是由类型系统后面的内部id系统排序的,这意味着在应用程序中更改它变得非常脆弱,因为排序可能会在您下面发生根本性的变化,这意味着字符串|数字可能随机变成[number,string]在任何给定的时间点。然而您可以使用UnionToTuple排列,这可能会解决您的问题…哇,这很有效。但是,我有几十个可能值的类型,查找所有排列有点昂贵。我想我会坚持我的简单解决方案,即使它不那么漂亮。没问题,那是递归解决方案开始出现的时候die@ShanonJackson是的,生成所有置换是一个想法,我只是担心一个简单的例子会杀死编译器。我的意思是,对于10个元素的并集,你有10个元素!排列为3628800。10看起来不像是一个联合体中的大量元素。我之前的评论站没有用。或者至少非常谨慎地使用,当你的编译器停止运行时,把这个代码看作是它可能会遇到的问题。是的,你绝对达到了10,你的编译器完成的单位是一个黑客协议100%,我在其中一个例子中有22个,而这不是最大的例子。我想Typescript需要一个更好的解决方案来解决这个问题。
type PermutationsOfA = UnionToTuple<A>; // ["foo", "bar"] | ["bar", "foo"]

const test: PermutationsOfA = ["foo", "bar"] // pass
const test1: PermutationsOfA = ["bar", "foo"] // pass
const test2: PermutationsOfA = ["bar", "foo", "baz"] // fail
const test3: PermutationsOfA = ["foo"] // fail