如何将字符串数组转换为TypeScript类型?

17

我有一个数组:

const arr = ["foo", "bar", "loo"]

我需要将它转换为 TypeScript 类型

type arrTyp = "foo" | "bar" | "loo";

我该如何在typescript中实现这个?


1
type 是数据类型吗? - BadPiggie
1
除非TypeScript支持宏,否则可能无法实现。 - Wong Jia Hau
@WongJiaHau 是的,不需要宏,只需要一个普通的通用函数 :) - Titian Cernicova-Dragomir
1个回答

27

针对3.4及以上版本进行编辑:

在3.4版本中,添加了const断言,因此我们可以使用as const来获取一个字符串字面量类型元组:

const arr = ["foo", "bar", "loo"] as const

type arrTyp = typeof arr[number]; // "foo" | "bar" | "loo"

Translated

问题在于arr不会保留数组中的文字类型,它会被推断为string[]。如果您使用函数来强制推断字符串字面量类型,则提取类型将变得非常简单:

function tuple<T extends string[]>(...o: T) {
    return o;
}
const arr = tuple("foo", "bar", "loo")

type arrTyp = typeof arr[number]; // "foo" | "bar" | "loo"

该函数强制编译器为arr推断出一个字符串字面量元组。因此,arr将被类型化为["foo", "bar", "loo"]。然后,我们可以使用类型查询来获取元组中元素的联合。您可以在这里了解更多关于类型查询的信息。

1
它已经可用。能否请您稍微解释一下typeof arr[number]呢?我以前从未见过这样的内容。arr现在是一个数组。但arr[number]又是什么呢? - Wajahath
1
@Wajahath 添加了语法的说明和文档链接。 - Titian Cernicova-Dragomir
惊人的解决方法!希望将来会有更自然的方式来完成这个。 - Simon
2
@Simon 更新了,使用了3.4中的新语法。感谢你让我重新关注这个答案。我有很多类似的答案,无法全部更新。 - Titian Cernicova-Dragomir
太棒了,可爱的TypeScript :) 不过,关于之前的回答,我只是好奇,为什么“函数会强制编译器推断出一个字符串字面量的元组”? - aderchox
很棒的回答,可爱的TypeScript :) 不过,关于之前的回答,我只是好奇,为什么确切地说“这个函数强制编译器推断出一个字符串字面量的元组”呢? - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接