遇到的 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 找的,但是有些找不到了(……

08-14 14:56