使用将字符串转换为大写后,将字符串值从一种类型分配给另一种类型

Assign a string value from one type to another type after using converting the string to upper case

第一种:

declare type roles = 'admin' | 'user';

其他类型

declare type ROLES = 'ADMIN' | 'USER';

我需要从第一个赋值到第二个,这是我当前的代码:

const r: roles = 'admin';
const R: ROLES = r.toUpperCase() as ROLES;

但我不想显式转换,有没有更好的解决方法而不强制转换?

编辑: 我采用的解决方案:

const r: roles = 'admin';
const R: ROLES = r.toUpperCase() as Uppercase<roles>;

使用这种方法,如果稍后将新值添加到 roles 而不是 ROLES,TS 将抱怨不匹配。

遗憾的是,某处需要演员表。内置 toUpperCase() 方法 returns 类型 string,即使您在字符串文字值上调用它也是如此。所以你开始使用的字符串文字的类型在调用时丢失了。

您可以稍微将转换传递给行并创建一个通用函数:

function toUpperCase<T extends string>(str: T): Uppercase<T> {
    return str.toUpperCase() as Uppercase<T>
}

const r: roles = 'admin';
const R: ROLES = toUpperCase(r); // works

但出于同样的原因,这里仍然需要强制转换。但至少现在演员没有对您的数据模型进行硬编码。

这个解决方案是否是对 as ROLES 案例的改进是一个见仁见智的问题。

Playground