машинопись импортирует неправильный угловой

Я импортирую angular в свое приложение angular 1 (в машинописном тексте), используя синтаксис, как показано ниже.

   import * as angular from 'angular';

Это импортирует angular из angular-mocks, а не из angular, из-за чего моя реализация ILogService не работает.

ОШИБКА в ./app/shared/Logger.factory.ts (38,7): ошибка TS2420: класс Logger неправильно реализует интерфейс ILogService. Типы свойства «отладка» несовместимы. Тип '(...аргумент: любой[]) => void' не может быть назначен типу 'ILogCall'.

Даже когда я пытаюсь перейти к 'angular' из vscode, я перехожу к угловому определению angular-mocks. Он должен перейти к угловому, а не издеваться над библиотекой...

Как избежать этой проблемы?

ИЗМЕНИТЬ

Ниже представлена ​​реализация

Реализация, которую я имею, представляет собой пользовательский сервис, о котором машинопись выдает ошибку во время компиляции (ошибка вставлена ​​​​выше)

class Logger implements ng.ILogService {
     info(message:string) { //some custom logic in info method}
}

angular.service('logger', Logger)

person harishr    schedule 14.01.2017    source источник
comment
из-за чего моя реализация ILogService дает сбой — какая реализация? Пожалуйста, предоставьте весь код, необходимый для воспроизведения проблемы. См. stackoverflow.com/help/mcve. Это импортирует angular из angular-mocks, а не из angular — откуда такой вывод? То, как VS Code перемещается между классами, влияет только на то, как оно перемещается, и ни на что другое.   -  person Estus Flask    schedule 18.09.2017
comment
См.: stackoverflow.com/q/40664298/4110233. Ответы здесь   -  person TheChetan    schedule 21.09.2017


Ответы (2)


Это вызвано тем, что типизация angular-mock является дополнением к angular. Другими словами, реальный интерфейс ILogCall должен быть:

interface ILogCall {
    (...args: any[]): void;   //from @types\angular\index.d.ts
    logs: string[];    //from @types\angular-mocks\index.d.ts
}

Итак, в вашем коде:

info(message:string) { //some custom logic in info method}

вам нужно вернуть правильный объект ILogCall (со всеми членами). Ответ @TheChetan и @Natarajan Nagarajugari может быть полезен, но я не уверен, что это сломает ваши модульные тесты для написания TypeScript.

Мое решение находится в информации (сообщение: строка):

info(message:string)
{
    var logCall: any = (...args: any[]) => {};
    logCall.logs = //something;

    return logCall as ng.ILogCall;
}
person Clark.Hsu    schedule 22.09.2017
comment
так что, если я не ошибаюсь, вы предлагаете реализовать оба интерфейса - person harishr; 22.09.2017
comment
это нормальное решение, но есть ли способ отключить загрузку определений из angular-mocks - person harishr; 22.09.2017

попробуй это..

import * as _angular_ from 'angular';

declare global {
const angular: typeof _angular_;
}

Надеюсь, это поможет вам

person Natarajan Nagarajugari    schedule 18.09.2017
comment
было бы полезно, если бы вы могли объяснить этот ответ, почему он будет работать - person harishr; 19.09.2017