gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 06:10:50 24 4
gpt4 key购买 nike

我在一些与定义 SQL 表/ View 及其所有列相关的代码中使用了很多文字字符串联合类型及其数组。

请参阅下面的示例代码,其中我们有一个示例 user SQL 表,其中包含以下列:idusernameemail, 密码....

export type UserTableColumnName = 'id' | 'username' | 'email' | 'password';
export type ArrayOfUserTableColumns = UserTableColumnName[]; // This allows for redundant values, but I don't want it to allow them

function choose_some_user_table_columns(chosen_columns: ArrayOfUserTableColumns) {
// function code not important
}

/**
* This is fine, no error should occur:
*/
choose_some_user_table_columns(['id', 'email']);

/**
* I want the code below to trigger a TypeScript typing error due to the 'email' element value being given twice:
*/
choose_some_user_table_columns(['id', 'email', 'email']);

有什么方法可以根据(或类似于)UserTableColumnName[] 创建类型 - 但是如果多次给出相同的值,TypeScript 会触发错误吗?例如email 在上面代码示例的最后一行被指定了两次。

我追求的是 TypeScript 解决方案(而不是运行时 JS 检查)。

理想情况下,如果我的编辑器(vscode 或任何支持 TypeScript 的编辑器)只建议数组中不存在的列名,那也很棒。由于目前 intellisense 将自动建议每一列,无论它们是否已经在数组中。

最佳答案

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

type UniqueItems<T extends string, U extends string[] = []> = U | {
[K in T]: UniqueItems<Exclude<T, K>, [...U, K]>
}[T]

但是,请注意,这并不能很好地扩展。在 T 联合中有 1 个项目,您会得到 2 个元组。有 2 个项目,5 个元组。有 N 个项目,2N + 1 个元组。 Fabian 链接的答案在某些情况下会更好,但这将为其他情况提供显着更好的自动完成功能。 Playground link .

关于arrays - TypeScript:来自字符串联合文字数组类型,不允许数组中存在任何冗余值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64243127/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com