【问题标题】:How to get class / interface type clone with 'forgotten' property types ('any' instead of 'string' | 'boolean' etc.)?如何使用“忘记”属性类型(“任何”而不是“字符串”|“布尔”等)获取类/接口类型克隆?
【发布时间】:2021-07-10 14:58:05
【问题描述】:

如何使用“被遗忘的”属性类型(“any”而不是“string”|“boolean”等)获取类/接口类型克隆?请考虑以下代码:

class Pet {
  name: string;
}

class User {
  username: string;
  pet: Pet;
}

type MakePropTypesAny<T> = T; // what here?

const q: MakePropTypesAny<User> = {
  username: true, // error: 'boolean' != 'string --> I want 'any' here
  pet: {
    name: true, // error: 'boolean' != 'string' --> I want 'any' here
  },
};

【问题讨论】:

    标签: typescript types typescript-generics


    【解决方案1】:

    如果T 不是对象,您希望MakePropTypesAny&lt;T&gt; 成为conditional type,它会将T 转换为any,否则它会生成mapped type,该mapped type 会向下进入键@987654328 处的每个属性@ 的 T 并递归地将 MakePropTypeAny 应用于每个:

    type MakePropTypesAny<T> =
      T extends object ? {
        [K in keyof T]: MakePropTypesAny<T[K]>
      } : any;
    

    这会将User 转换为您要查找的类型:

    type AnyUser = MakePropTypesAny<User>;
    /* type AnyUser = {
        username: any;
        pet: {
            name: any;
        };
    } */
    

    您的示例按需要工作:

    const q: MakePropTypesAny<User> = {
      username: true,
      pet: {
        name: true,
      },
    };
    

    Playground link to code

    【讨论】:

    • 效果很好!谢谢你:)
    猜你喜欢
    • 1970-01-01
    • 2020-01-08
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-08
    • 1970-01-01
    相关资源
    最近更新 更多