TypeScript中如何让函数参数仅接受数组内的元素值?
实现数组元素值的类型约束函数
要实现你需要的功能,核心是让TypeScript推断出数组的字面量元素类型,而非宽泛的string[],再基于这个类型约束函数参数。具体实现如下:
给数组添加
as const断言,让TypeScript将数组类型锁定为包含具体元素的只读字面量数组:const myArray = ["foo", "bar"] as const;定义
pick函数时,用typeof myArray[number]获取数组元素的联合类型,作为参数的类型约束:function pick(what: typeof myArray[number]) { // 这里写函数逻辑 }
此时调用函数的效果完全符合你的需求:
pick("foo")合法,参数属于数组元素的联合类型pick("inexistent")触发TypeScript类型错误,因为该值不在"foo" | "bar"范围内
补充说明
as const断言会将数组转为只读类型(readonly ["foo", "bar"]),如果需要可修改的数组,可以单独提取元素类型后声明:type ArrayElement = typeof myArray[number]; const mutableArray: ArrayElement[] = [...myArray];- 若不想使用
as const,也可以手动定义元素联合类型再声明数组:type AllowedValues = "foo" | "bar"; const myArray: AllowedValues[] = ["foo", "bar"]; function pick(what: AllowedValues) {}
但第一种方式更简洁,无需手动维护联合类型,数组元素变更时类型会自动同步。
内容的提问来源于stack exchange,提问作者kraftwer1
相关产品推荐
相关产品推荐

