Выбор перегрузки plainToClass вызывает ошибку типа - PullRequest
0 голосов
/ 04 июня 2019

Я работаю над угловым проектом.Большая часть кода не моя, но мне нужно его скомпилировать.

Хотя следующий пример компилируется на одной машине, он генерирует ошибку на других.

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 класса-преобразователя.

Кажется, что выбрана одна перегрузка методана одной машине, но не на другой.И это происходит довольно случайно.

Есть ли способ решить эту проблему глобально?

1 Ответ

1 голос
/ 04 июня 2019

Я не совсем уверен, как вам помочь, но вот некоторые мысли, которые могут помочь. 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 как any, plainToClass не знает, какую реализацию использовать, и поэтому компилятор может подумать, что вы используете export function plainToClass<T, V>(cls: ClassType<T>, plain: V, options?: ClassTransformOptions): T; (у которого нет filter -метода, потому что он не возвращает массив).

Если вы объявляете myObject как any[] или используете plainToClass следующим образом: plainToClass<any[]>(MyClass, myObject).filter(true); // added <any[]> это может работать, так как компилятор знает, какой метод использовать (тот, который возвращает массив), и вы можете используйте .filter на нем.

Другая вещь, которая может помочь, - это создать собственную функцию plainToClass, которая возвращает только массив и использует метод из class-transformer пакета / библиотеки.

Это всего лишь догадки, но, надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...