Выбор перегрузки 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
пакет / библиотека.
Это всего лишь догадки, но, надеюсь, это поможет.