0

我正在做一个有角度的项目。大部分代码不是我的,但我需要编译它。

虽然以下示例在一台机器上编译,但它会在其他机器上生成错误。

import { plainToClass } from 'class-transformer';

plainToClass(MyClass, myObject).filter(true);

我在运行时遇到的错误ng build如下:

error TS2339: Property 'filter' does not exist on type 'MyClass'.

myObject被声明为any但包含一个数组。如果我按如下方式更改代码,它就可以工作。

plainToClass(MyClass, myObject as any[]).filter(true);

问题是相同的方法分散在整个项目中。

我想知道为什么同一段代码在一台机器上运行,而在另一台机器上却不行。

在两台机器(相同package.json)上,使用了 0.2.0 版的 class-transformer。

似乎在一台机器上拾取了该方法的一个重载,但在另一台机器上却没有。这发生得相当随机。

有没有办法在全球范围内解决这个问题?

4

1 回答 1

1

我不完全确定如何帮助你,但这里有一些可能会有所帮助的想法。-plainToClass方法定义为

export function plainToClass<T, V>(cls: ClassType<T>, plain: V[], options?: ClassTransformOptions): T[];
export function plainToClass<T, V>(cls: ClassType<T>, plain: V, options?: ClassTransformOptions): T;
export function plainToClass<T, V>(cls: ClassType<T>, plain: V|V[], options?: ClassTransformOptions): T|T[] {
    return classTransformer.plainToClass(cls, plain as any, options);
}

来源:https ://github.com/typestack/class-transformer/blob/develop/src/index.ts

当您将 myObject 定义为anyplainToClass知道要使用哪个实现时,编译器可能会认为您正在使用 export function plainToClass<T, V>(cls: ClassType<T>, plain: V, options?: ClassTransformOptions): T;(它没有filter- 方法,因为它不返回数组)。

如果您确实声明myObjectany[],或使用plainToClass这样的:plainToClass<any[]>(MyClass, myObject).filter(true); // added <any[]>它可能会起作用,因为编译器知道要使用哪种方法(返回数组的方法),并且您可以使用.filter它。

另一件可能有帮助的事情是创建自己的plainToClass函数,它只返回一个数组,并使用class-transformer包/库中的方法。

这只是一些猜测,但希望它有所帮助。

于 2019-06-04T10:27:15.617 回答