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

Arrays TypeScript:从字符串联合文字数组类型中,不允许数组中存在任何冗余值

Arrays TypeScript:从字符串联合文字数组类型中,不允许数组中存在任何冗余值,arrays,typescript,literals,string-literals,union-types,Arrays,Typescript,Literals,String Literals,Union Types,我使用了大量的文本字符串联合类型和它们的数组来编写一些与定义SQL表/视图及其所有列相关的代码 请参见下面的示例代码,其中有一个示例用户SQL表,该表具有以下列:id,用户名,电子邮件,密码 导出类型UserTableColumnName='id'|'username'|'email'|'password'; 导出类型ArrayFuserTableColumns=UserTableColumnName[];//这允许冗余值,但我不希望允许它们 函数选择一些用户表列(所选列:ArrayFuserT

我使用了大量的文本字符串联合类型和它们的数组来编写一些与定义SQL表/视图及其所有列相关的代码

请参见下面的示例代码,其中有一个示例
用户
SQL表,该表具有以下列:
id
用户名
电子邮件
密码

导出类型UserTableColumnName='id'|'username'|'email'|'password';
导出类型ArrayFuserTableColumns=UserTableColumnName[];//这允许冗余值,但我不希望允许它们
函数选择一些用户表列(所选列:ArrayFuserTableColumns){
//功能代码不重要
}
/**
*这很好,不应出现错误:
*/
选择一些用户表列(['id','email']);
/**
*我希望下面的代码触发TypeScript键入错误,因为“email”元素值被给定了两次:
*/
选择一些用户表列(['id'、'email'、'email']);
是否有任何方法可以根据(或类似于)
UserTableColumnName[]
创建类型,但如果多次给定相同的值,TypeScript将触发错误?e、 g.
电子邮件
在上述代码示例的最后一行中指定了两次

我想要一个TypeScript解决方案(而不是运行时JS检查)


理想情况下,如果我的编辑器(vscode,或任何支持TypeScript的编辑器)只建议数组中不存在的列名,那就太好了。目前,intellisense将自动建议每个列,而不管它们是否已在数组中。

您可以使用表示递归算法中每个步骤的映射类型来执行此操作,以生成所有允许的数组排列。(TS 4.0+由于变量元组的使用,您可以在旧版本中执行此操作,但它会变得混乱)

type UniqueItems=U|{
[K in T]:唯一项
}[T]

但是,请注意,这并不能很好地扩展。在
T
联合中有一个项目,就得到了两个元组。有2个项目,5个元组。对于N个项,2N+1个元组。对于某些情况,Fabian linked的答案会更好,但对于其他情况,这将提供更好的自动完成功能

这回答了你的问题吗?只是一个想法:使用字典,使用列名作为键,布尔值作为值。Typescript没有抱怨,因为您正在实例化一个数组,其中每个成员都可以是其中一个列名。谢谢您的回答!您是否有可能在OP中添加一个基于我的现有类型使用您的
UniqueItems
类型的示例?我尝试了
类型disallowedundant=UniqueItems
和其他一些尝试,但似乎没有任何区别。“我使用的是TypeScript 4.0.3,所以不确定这是否足够新?”LaVache添加了一个游乐场链接
type UniqueItems<T extends string, U extends string[] = []> = U | {
  [K in T]: UniqueItems<Exclude<T, K>, [...U, K]>
}[T]