Подтвердить что ты не робот

Что объявляет 'declare' в 'export declare class Actions'?

Зачем нам нужен declare в инструкции?

export declare class Actions {
    ...
}
4b9b3361

Ответ 1

нашел то, что искал:

Объявить vs var

var создает новую переменную. declare используется для указания TypeScript, что переменная была создана в другом месте. Если вы используете declare, в генерируемый JavaScript ничего не добавляется - это просто подсказка для компилятора.

Например, если вы используете внешний script, который определяет var externalModule, вы должны использовать declare var externalModule для подсказки компилятору TypeScript, который externalModule уже настроен

Ответ 2

Чтобы понять это, вы должны сначала понять ключевое слово "объявлять".

Вот хорошее объяснение из блога Джила Финка:

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

Например, давайте представим, что у нас есть библиотека myLibrary, у которой нет файла объявления TypeScript и в глобальном пространстве имен есть пространство имен myLibrary. Если вы хотите использовать эту библиотеку в своем коде TypeScript, вы можете использовать следующий код:

declare var myLibrary;

Тип, который среда выполнения TypeScript придаст переменной myLibrary, - это любой тип. Проблема в том, что у вас не будет Intellisense для этой переменной во время разработки, но вы сможете использовать библиотеку в своем коде. Другой вариант иметь такое же поведение без использования ключевого слова объявления - просто использовать переменную любого типа:

var myLibrary: any;

Оба примера кода приведут к одному и тому же выводу JavaScript, но пример объявления более читабелен и выражает окружающее объявление.


Поэтому после того, как вы поймете ключевое слово "объявить", вернитесь туда, где вы найдете

export declare class Action{
...
}

Реальная реализация класса, вероятно, находится где-то еще - возможно, файл .js.

Ответ 3

declare в машинописном тексте:

Ключевое слово declare в машинописном тексте полезно для того, чтобы сообщить компилятору машинописного текста, что объявление определено где-то еще (где-то записано во внешнем файле javascript или в части среды выполнения).

Допустим, у нас есть переменная с именем foo, объявленная где-то еще. Когда мы попытаемся сослаться на переменную, компилятор машинописного текста выдаст ошибку:

foo = 'random'; // Error: 'foo' is not defined

Мы можем решить эту проблему, используя ключевое слово declare:

declare var foo: string;
foo = 'random';  // no error anymore

Это имеет следующие последствия:

  • Когда foo фактически нигде не объявлено, и мы пытаемся использовать переменную, может произойти ошибка во время выполнения. Поэтому используйте ключевое слово declare только тогда, когда вы знаете, что переменная доступна в данный момент.
  • Поскольку мы знаем типы, мы (потенциально) получаем доступ к нашей IDE Intellisense.
  • Поскольку мы знаем типы, компилятор машинописного текста может проверять типы во время компиляции и предупреждать нас, если мы используем неправильные типы в определенных сценариях.

Ответ 4

объявите ключевое слово в данном конкретном случае:

export declare class Actions {
    ...
}

... очевидно бесполезно, и я думаю, что TypeScript должен рассмотреть возможность сделать это ошибкой (я не знаю, есть ли скрытая причина). Если вы объявляете класс, вам никогда не потребуется его импортировать. Если вы экспортируете класс, ожидая, что кто-то его импортирует, вам не нужно объявлять его. И поскольку вы объявляете этот класс, по определению этот класс должен использоваться без необходимости его импорта. Но это не так, когда вы экспортируете, объявляете класс. Вам нужно импортировать его для использования.

TL; DR

export declare class Actions {
    ...
}

такой же, как

declare class Actions {
    ...
}

Ответ 5

declare - без каких-либо ключевых слов импорта или экспорта - определяет файлы объявлений, автоматически выбираемые TypeScript, что является полезной функцией для добавления типизации к устаревшим модулям (установленные пакеты npm без определений TypeScript).

import/export - это правильный способ использования модулей, и все должно быть импортировано вручную (и я нахожу это немного утомительно), либо это логика, либо определения.

В качестве практического варианта использования export declare позволяет избежать экспорта всех подэлементов, например:

export declare namespace Redux {
    namespace Store {
        interface Definition { ... }
    }
}

Что может быть проще для чтения, чем:

export namespace Redux {
    export namespace Store {
        export interface Definition { ... }
    }
}

Внешний импорт одинаков в обоих случаях (например, import { Redux } from 'definitions/redux';), что я не знаю, хорошая ли это практика или нет, но я считаю это опрятным! ^^

Важно помнить, что добавление import или export к вашему файлу сделает его модулем, поэтому область действия declare больше не будет на глобальном уровне.

PS, есть ошибка (выпуск 16671): если вы используете const enum в своем объявлении (я делаю это для типа действий приставки) и вы указали флаг transpileOnly (create-реагировать-приложение) -текстовый пакет делает, поэтому я знаю), enum не будет встроен! Вы можете участвовать в этом, вы не можете, но это полезно знать заранее!