如何基于数组值定义类型?const数组场景下实现方法问询
当然可行!这里的关键是利用 TypeScript 的const断言来保留数组元素的字面量类型,再通过typeof操作符提取出我们需要的联合类型。
具体实现步骤
- 给const数组添加
as const断言
默认情况下,const names = ['Mike', 'Jeff', 'Ben']会被 TypeScript 推断为string[]类型——也就是一个元素为任意字符串的数组,这样就没法限定具体的取值范围了。我们需要用as const告诉 TS:这个数组的元素是只读的字面量,不能被修改,同时保留每个元素的具体类型:
const names = ['Mike', 'Jeff', 'Ben'] as const;
此时names的类型会变成readonly ["Mike", "Jeff", "Ben"],每个元素都是具体的字符串字面量。
- 定义
UserName类型
借助typeof操作符,我们可以提取数组元素的联合类型:
type UserName = typeof names[number];
这里的typeof names[number]相当于取数组所有元素类型的联合,也就是"Mike" | "Jeff" | "Ben",完美符合我们的需求。
- 编写
hello函数
现在直接把UserName作为参数类型即可:
function hello(name: UserName) { console.log(`Hello, ${name}!`); }
验证效果
- 合法调用:
hello('Mike')、hello('Jeff')、hello('Ben')都能正常通过编译。 - 非法调用:如果尝试
hello('John'),TypeScript 会直接抛出错误,提示类型"John"不能赋值给类型"Mike" | "Jeff" | "Ben",完全达到了我们想要的限制效果。
补充说明
如果你没办法直接修改原数组的定义(比如数组是第三方代码提供的),也可以在类型定义时做特殊处理,但这种方式不如直接给数组加as const可靠:
const names = ['Mike', 'Jeff', 'Ben']; // 通过类型推断提取字面量类型(仅当数组元素是字面量且未被修改时有效) type UserName = typeof names[0] | typeof names[1] | typeof names[2];
但最推荐的还是直接给const数组添加as const断言,它是最简洁且不易出错的方式。
内容的提问来源于stack exchange,提问作者Freewind
相关产品推荐
相关产品推荐

