Какова цель ключевого слова declare?

type Callback = (err: Error | String, data: Array) => void;

по сравнению с

declare type Callback = (err: Error | String, data:Array) => void;

Не удается найти документы, объясняющие назначение ключевого слова declare в TS.

Ответы (5)

Из документов Typescript:

Машинопись - Работа с другими библиотеками JavaScript

Чтобы описать форму библиотек, написанных не на TypeScript, нам нужно объявить API, предоставляемый библиотекой. Поскольку большинство библиотек JavaScript предоставляют только несколько объектов верхнего уровня, пространства имен - хороший способ их представления.

Мы называем объявления, не определяющие реализацию, «окружающим». Обычно они определяются в файлах .d.ts. Если вы знакомы с C / C ++, вы можете рассматривать их как файлы .h. Давайте посмотрим на несколько примеров.

Окружающие пространства имен

Популярная библиотека D3 определяет свои функции в глобальном объекте d3. Поскольку эта библиотека загружается через тег (вместо загрузчика модуля), ее объявление использует пространства имен для определения ее формы. Чтобы компилятор TypeScript увидел эту фигуру, мы используем объявление внешнего пространства имен. Например, мы могли бы начать писать его так:

D3.d.ts (упрощенная выдержка)

объявить пространство имен D3 {
    export interface Selectors {
        Выбрать: {
            (селектор: строка): Выбор;
            (элемент: EventTarget): Выбор;
        };
    }
    // (...)
}

TL; DR

declare используется, чтобы сообщить компилятору, что «эта вещь (обычно переменная) уже существует, и поэтому на нее может ссылаться другой код, также нет необходимости компилировать этот оператор в какой-либо JavaScript».

Обычный вариант использования:

Вы добавляете ссылку на свою веб-страницу в файл JavaScript, о котором компилятор ничего не знает. возможно, это скрипт из другого домена, например foo.com. при оценке скрипт создаст объект с некоторыми полезными методами API и присвоит ему идентификатор 'fooSdk' в глобальной области.

Вы хотите, чтобы ваш код TypeScript мог вызывать fooSdk.doSomething (), но поскольку ваш компилятор не знает, что эта переменная существует, вы получите ошибку компиляции.

Затем вы используете ключевое слово declare как способ сказать компилятору «поверьте мне, эта переменная существует и имеет этот тип». Компилятор будет использовать этот оператор для статической проверки другого кода, но не будет преобразовывать его в какой-либо JavaScript в выходных данных.

declare const fooSdk = { doSomething: () => boolean }
• 100001 не понимает.

Ваш конкретный пример отличается, поскольку вы объявляете тип, а не переменную, типы уже не компилируются в какой-либо JavaScript. Не знаю, есть ли причина объявлять тип.

Вы можете использовать declare, чтобы сообщить компилятору о типах, прежде чем писать какой-либо код реализации, и TypeScript будет счастлив.

declare function foo(name: string): string

ключевые слова delcare используются, когда вы импортируете некоторую библиотеку, не имеющую файлов типа объявления, например * .d.ts

после этого vs eslint не проверяет синтаксис и контекст, позволит вам пройти, если вы по умолчанию используете компилятор tsc, это хорошая причина объявить об удалении синтаксической ошибки

Вот пример из реальной жизни.

У меня есть приложение TypeScript React, которое использует Hot Middleware Webpack. Hot Middleware Webpack написан не на TypeScript, а на старомодном JavaScript. Таким образом, у него нет объявлений типов, которые компилятор TypeScript мог бы проверить.

• 100001 100004 *

Объект module также имеет ключи, например module.hot, и ключи могут иметь значения. Но компилятор времени разработки TypeScript (по крайней мере, в VSCode) рисует красную волнистую линию под ним, говоря, что свойство 'hot' не существует. Но он есть!

Чтобы компилятор TypeScript согласился, объявите это так:

declare let module: any

Существующий объект module, теперь имеет тип any, что делает компилятор TypeScript счастливым, красный волнистый цвет исчез, и теперь я могу продолжать компилировать и писать другой код .

Если вы удалите ключевое слово declareи просто напишите let module: any, оно не будет компилироваться, вместо этого будет сказано, что 'module' уже существует. Вот что означает "окружающий" в принятом ответе.

2022 WebDevInsider