Выбор перегрузки plainToClass вызывает ошибку типа

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

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

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 ответ

Я не совсем уверен, как вам помочь, но вот некоторые мысли, которые могут помочь. 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 пакет / библиотека.

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

Другие вопросы по тегам