如何在TypeScript中从枚举创建类型化模板文本



有没有办法让TS知道param不仅仅是string,而且是类型RoleWithTier(显式as强制转换除外(?

enum Role {
USER = 'user',
ADMIN = 'admin'
}
enum Tier {
ENTRY = 1,
MAXIMUM = 10
} 
type RoleWithTier = `${Role}.${Tier}`

const param = `${Role.USER}.${Tier.ENTRY}`
const selectAction = (rwt: RoleWithTier) {
// do stuff
}
selectAction(param) // Argument of type 'string' is not assignable to parameter of type '"user.1" | "user.10" | "admin.1" | "admin.10"'.(2345)

TS游乐场链接

当您声明param时,它的类型被推断为string,随后的调用不会改变这一点。直接传递模板字符串:

selectAction(`${Role.USER}.${Tier.ENTRY}`); // ok

或者添加const断言:

const param = `${Role.USER}.${Tier.ENTRY}` as const;

您可以正常键入param变量:

const param: RoleWithTier = `${Role.USER}.${Tier.ENTRY}`;

此外,参数值中缺少.