TypeScript: объявить глобальную переменную с типом из другого внешнего внешнего модуля без импорта

У меня есть этот код в файле global.d.ts, чтобы сделать глобальные ярлыки для определенных функций:

///<reference path="../../typings/react/react.d.ts"/>
declare var a: React.HTMLFactory;

Но компилятор терпит неудачу с не найденным именем «React». Если я добавлю:

import React = require('react');

он находит тип, но затем объявление модулируется, а это не то, что мне нужно.

Можно ли объявить такой глобальный с помощью TypeScript 1.4? Или может 1,5?


person asgerhallas    schedule 10.04.2015    source источник


Ответы (2)


React как пространство имен (внутренний модуль)

Файл react-global.d.ts содержит определение внутреннего модуля React:

// -------- global.d.ts --------
///<reference path="react-global.d.ts"/>
declare var a: React.HTMLFactory;

React как внешний модуль

Файл react.d.ts содержит определение внешний модуль "react".

Во-первых, я предлагаю использовать TypeScript 1.5-альфа, потому что синтаксис модулей изменен при выравнивании TS на ES6. Внешние модули из ES6 — это будущее.

Чтобы использовать внешний модуль:

// -------- global.d.ts --------
///<reference path="react.d.ts"/>
import * as React from 'react'; // syntax ES6 / TS 1.5
declare var a: React.HTMLFactory;
// export something here

NB. ///<reference здесь необязателен, потому что файл .d.ts имеет то же имя, что и внешний модуль.

person Paleo    schedule 10.04.2015
comment
Благодарю вас! Я попробую это прямо сейчас. Чтобы быть уверенным, вы говорите, что в 1.4 невозможно ссылаться/повторно объявлять внешний модуль как пространство имен? - person asgerhallas; 10.04.2015
comment
Однако я до сих пор не понимаю, почему документация TS для внешнего внешнего модуля использует экспорт, а в react.ts.d его нет. Документация неверна? - person asgerhallas; 10.04.2015
comment
я отредактировал. Я попытался скомпилировать некоторый код, и я не уверен, что это правильное решение. - person Paleo; 10.04.2015
comment
Я как бы заработал версию внутреннего модуля, скопировав весь код внешнего модуля в пространство имен. Это оставляет мне как внешнюю, так и внутреннюю реализацию. Я не уверен, я понимаю ваше редактирование, хотя... не могли бы вы уточнить это? К сожалению, я еще не смог скомпилировать с использованием 1.5-альфа. Я все еще работаю над этим :) - person asgerhallas; 10.04.2015
comment
Хотел бы я сделать что-то вроде declare module React = "react" - person asgerhallas; 10.04.2015
comment
Я проголосовал за ответ, но все еще ищу решение, если оно есть :) - person asgerhallas; 13.04.2015
comment
Я нашел решение: есть два файла определения для React: react.d.ts и react-global.d.ts. Просто используйте второй. - person Paleo; 14.04.2015

Я думаю, что проблема в том, что компилятор ts не может составить внутренние (с инструкцией include - ///<reference>) и внешние (AMD или commonjs) модули. Таким образом, вы не могли использовать теги ///<reference> с функцией require.

Вы компилируете этот файл с флагом AMD?

person Pavel Patrin    schedule 10.04.2015
comment
Он скомпилирован с флагом commonjs... Я не совсем уверен, что вы имеете в виду, включая теги? - person asgerhallas; 10.04.2015
comment
///‹ссылка› работает как включение. См. файл результатов. Но он несовместим с внешними модулями (comonjs — это внешний модуль). - person Pavel Patrin; 10.04.2015
comment
Извините Павел, очень надеюсь, что это не прозвучит слишком грубо, но я не понимаю ответа. Это решение проблемы или просто объяснение почему не работает? - person asgerhallas; 10.04.2015
comment
Мне тоже жаль. Попробуйте описать возможную проблему. 1. Когда вы используете компилятор ts без флага --module, он заменяет теги ///<reference>, заменяя их содержимым файла (например, include в C++, как работа препроцессора). 2. Когда вы используете компилятор ts с флагом --module, он игнорирует любой тег ///<reference>. Это потому, что внутренние и внешние модули несовместимы. - person Pavel Patrin; 10.04.2015
comment
///<reference> не является несовместимым с внешними модулями. См. в конце этого сообщения. - person Paleo; 10.04.2015
comment
А... спасибо, кажется, теперь я вас понимаю. Но даже если я компилирую с любым флагом модуля, он все равно не найдет тип. И даже если я скопирую все содержимое указанного модуля в файл global.ts.d, он не сможет найти тип React.HTMLFactory. - person asgerhallas; 10.04.2015
comment
О, я не видел ваш последний пост, прежде чем я отправил. сразу проверю :) - person asgerhallas; 10.04.2015