【问题标题】:Convert the Normal class to generic in typescript在打字稿中将 Normal 类转换为泛型
【发布时间】:2022-10-22 01:50:45
【问题描述】:

我有一个类来获取 JSON 对象并将它们转换为我想要的类。代码如下。


import {plainToClass} from "class-transformer";
import UserDto from "../../auth/dto/user.dto";

class ConvertJson {
    
    userData(data) {
        return plainToClass(UserDto, data);
    }
}

当我想将类转换为泛型类时


import {plainToClass} from "class-transformer";
import UserDto from "../../auth/dto/user.dto";

class ConvertJson<T> {

    userData(data) {
        return plainToClass(T, data);
    }
}

我收到此错误

T 仅指一种类型,但在这里用作值

【问题讨论】:

  • T 是一种类型,而不是值。您需要接受构造函数参数,如userData&lt;T&gt;(ctor: { new(): T; }, ...) {...}userData(UserDto, ...)

标签: javascript typescript class class-transformer


【解决方案1】:

调整代码后,我发现 typescript generic 与 C# 或其他语言非常不同,所以我将代码转换为这个,因此它具有通用的氛围,但没有语法。


import {plainToClass} from "class-transformer";

interface IClass {
    new (...args : any[])
}

class ConvertJson {

    constructor(private dto : IClass) {
    }

    userData(data) {
        return plainToClass(this.dto, data);
    }
}


我使用 IClass 而不是 any 的原因是我想确保 其他队友使用类,而不是其他类型。

【讨论】:

    【解决方案2】:

    从 Milad 的评论中增强?
    class-transformer 提供一些通用类来做他介绍的相同的事情。

    import { plainToClass, ClassConstructor } from "class-transformer";
    
    class ConvertJson {
        userData<TargetClass>(data: unknown, dtoClass: ClassConstructor<TargetClass>) {
            return plainToClass(dtoClass, data);
        }
    }
    

    我的class-transformer 版本是 v0.5.1

    ✍注意:
    plainToClasss 已弃用❌
    改用plainToInstance(一样)✅

    【讨论】:

      【解决方案3】:

      我想你想要做的是根据输入类型转换输出

      class ConvertJson<T> {
          userData(data) {
              return <T>plainToClass(data);
          }
      }
      

      【讨论】:

      • 这只是消除了错误但不起作用,在运行时出现此错误“无法读取未定义的属性(读取'构造函数')”
      • @Milad 当然你会得到一个错误,因为你的 plainToClass 方法需要两个参数。我给了你一个关于如何投射的提示......当你不提供方法的代码时,不要指望完整的解决方案
      猜你喜欢
      • 2018-12-17
      • 1970-01-01
      • 2021-11-26
      • 1970-01-01
      • 2020-11-21
      • 2021-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多