使用将字符串转换为大写后,将字符串值从一种类型分配给另一种类型
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
案例的改进是一个见仁见智的问题。
第一种:
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
案例的改进是一个见仁见智的问题。