遇到的 TS 类型转换案例
一些 TypeScript 中的手动类型转换,主自用(x
动态取得 enum 的值
这是之前碰到的一个案例,一些 key 是从后端获取的,然后 enum 是在 ts 中定义的,不过会报错说不是 enum 的类型之类的,解决方案是使用 as keyof typeof SomeEnum
。有些复杂的情况下直接将 enum 转成 any
也可以:
enum SomeEnum {}
const randomKeyFromAPI = '';
const enumValue = SomeEnum[randomKeyFromAPI as keyof typeof SomeEnum];
// not preferable
const enumValue = (SomeEnum as any)[randomKeyFromAPI];
循环对象
这里的解决的主要是 Object.keys()
这里与 type/interface 之间的不兼容问题:
let objKeys = Object.keys(data) as Array<keyof MyType>;
// 上下只需要用一个就好了
objKeys.map((item: keyof MyType) => {
return '';
});
一些 key 是可选的
这个解决的问题主要是,在前端操作对象的时候,表格中一些值是可修改的,另一些不行(如 id,createdTime 之类的):
interface SomeType {
prop1: string;
prop2: string;
prop3: string;
propn: string;
}
type OptionalExceptFor<T, TRequired extends keyof T> = Partial<T> &
Pick<T, TRequired>;
type NewType = OptionalExceptFor<SomeType, 'prop1' | 'prop2'>;
let o: NewType = {
prop1: '',
prop2: '',
};
循环时当前 key 为两个对象的共有 key
这个大概有更好的解决方法……?不过目前这是找到一个可以用的。
这种麻烦的情况也许真的不如全都用 any
吧(挠头
循环的话不知道有没有办法获得当前 key 的类型……好像是不行,因为说是 type/interface 只有在 compile time 有,runtime 没有,所以转完的类型重新赋值的时候只能用 any
……
export const convertEntityToPlace = <T>(
structure: Record<string, Partial<SomeStructure>>,
data: T
) => {
const convertedData: T = data;
for (const key of Object.keys(structure)) {
const toPlace = structure[key]?.toPlace ?? 0;
if (toPlace > 0) {
convertedData[key as keyof T] = ((data[key as keyof T] as number) /
Math.pow(10, structure[key].toPlace as number)) as any;
}
}
return convertedData;
};
reference
其实主要都是 stack overflow 找的,但是有些找不到了(……