TypeScript参数定义中这是避免使用ENUM的偷懒实现方式吗?
TypeScript参数预定义值约束写法判断
原有写法的问题
你提到的原有写法完全不能实现参数只能取三个预定义值的约束,问题出在两点:
- 逻辑或运算符的规则问题:
'alpha' || 'bravo' || 'charlie'在JS/TS运行时会直接返回第一个真值'alpha',后面两个值不会产生任何作用,只是把参数的默认值设为了'alpha' - 类型标注问题:参数被标注为
string类型,不管传入任意字符串都能通过TS类型校验,不会触发任何取值范围限制
// 原有写法等价于下面的代码,完全没有约束作用 static getEndpoint = (type: string = 'alpha') => {}
你的实现思路是正确的
使用枚举做类型约束是非常标准的实现方案,这种写法可以在编译阶段就拦截不符合要求的入参:
export enum MyTypes { ALPHA = 'alpha', BRAVO = 'bravo', CHARLIE = 'charlie', } static getEndpoint = (type: MyTypes = MyTypes.ALPHA) => {}
如果不想额外定义枚举,也可以选择更轻量的字符串字面量联合类型方案:
type MyTypes = 'alpha' | 'bravo' | 'charlie' static getEndpoint = (type: MyTypes = 'alpha') => {}
两种方案的适用场景:
- 枚举适合取值需要在项目多处分发复用、需要遍历可选值、或者需要绑定额外属性的场景,枚举编译后会生成真实存在的JS对象
- 字符串字面量联合类型更轻量,没有额外的编译产物,适合仅在当前方法做参数约束的场景
内容的提问来源于stack exchange,提问作者edjm
相关产品推荐
相关产品推荐

