如何将TypeScript的number类型映射为数字字符串字面量联合类型
解决TypeScript中数字类型到字符串字面量联合类型的映射问题
以下是几种可行的实现方式,你可以根据场景选择:
方法一:直接使用类型断言
既然已经预先确认actualNumber的值在0-2范围内,直接用类型断言告诉TypeScript该转换是安全的:
interface Destination { stringLiteralNumber: '0' | '1' | '2'; } const actualNumber: number = 1; const mapped: Destination = { stringLiteralNumber: actualNumber.toString() as '0' | '1' | '2', };
方法二:使用类型守卫+模板字面量类型
通过类型守卫做运行时校验,同时利用模板字面量类型让TypeScript自动推导对应字符串类型:
interface Destination { stringLiteralNumber: '0' | '1' | '2'; } function isValidTargetNumber(num: number): num is 0 | 1 | 2 { return num >= 0 && num <= 2 && Number.isInteger(num); } const actualNumber: number = 1; if (isValidTargetNumber(actualNumber)) { const mapped: Destination = { stringLiteralNumber: actualNumber.toString() as `${typeof actualNumber}`, }; }
方法三:封装转换函数
写一个兼顾运行时安全和类型正确性的转换函数,直接返回目标联合类型:
interface Destination { stringLiteralNumber: '0' | '1' | '2'; } function toTargetString(num: number): '0' | '1' | '2' { if (![0,1,2].includes(num)) { throw new Error('数值必须为0、1或2'); } return num.toString() as '0' | '1' | '2'; } const actualNumber: number = 1; const mapped: Destination = { stringLiteralNumber: toTargetString(actualNumber), };
内容的提问来源于stack exchange,提问作者raydenl
相关产品推荐
相关产品推荐

