gpt4 book ai didi

typescript - 在没有枚举开销的情况下获取字符串文字类型的数组值的方法

转载 作者:搜寻专家 更新时间:2023-10-30 20:40:39 25 4
gpt4 key购买 nike

在我的项目中,我需要一些字符串文字类型和允许值的数组,以用于类型保护等各种任务。

这就是我们拥有的:

type Animal = 'cat' | 'dog' | 'rabbit' | 'snake'
const animals: Animal[] = ['cat', 'dog', 'rabbit', 'snake']

它可以工作,但它需要在源代码中多次列出键。

另一种方法是使用 Get array of string literal type values 中建议的枚举但它会在运行时产生开销,因为枚举的编译代码比数组大。

我找到了另一种没有运行时开销的方法,但我不确定它是否会在未来工作,因为它可能是一个错误。

const notWidened = <T extends string>(val: T[]) => val

const animals = notWidened(['cat', 'dog', 'rabbit', 'snake'])
type Animal = typeof animals[0]

所以问题是使用这个代码段是否安全,或者它将来会崩溃。有没有更好的方法来获得文字字符串类型和数组而不重复。

最佳答案

目前我找不到很好的文档,但是你的 notWidened()功能工作得很好,不是错误。如果将类型参数限制为 string,TypeScript 将为泛型类型变量推断字符串文字或 string 的子类型.所以<T extends keyof U> , <T extends string> , <T extends 'a'|'b'>等将为 T 推断字符串文字. (如果您类似地约束 number,也可以推断出 booleanT 文字)。

据我所知,您的代码还不错;我唯一可能做的不同的事情是

type Animal = (typeof animals)[number]

代替

type Animal = typeof animals[0]

0 animals 的第一个元素实际上是 'cat' ,即使你已经告诉 TypeScript 它是 'cat'|'dog'|... .不过你的没问题。

正如我上面评论的那样,如果你想让 TypeScript 考虑 animals成为一个元组,其中 animals[0]类型为 'cat' , 和 animals[1]类型为 'dog'等,您可以使用类似函数 tuple() 的函数<罢工>在tuple.ts (2018 年 7 月更新,从 TypeScript 3.0 开始,编译器将能够 infer tuple types automatically ,因此函数可以更简洁):

export type Lit = string | number | boolean | undefined | null | void | {};
export const tuple = <T extends Lit[]>(...args: T) => args;

const animals = tuple('cat', 'dog', 'rabbit', 'snake');
type Animal = (typeof animals)[number]; // union type

这可能对你有用。


TL;DR:👍您的代码没问题。

希望对您有所帮助;祝你好运!

关于typescript - 在没有枚举开销的情况下获取字符串文字类型的数组值的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46176165/

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