Быстрое обновление 24 марта 2017 г.

Сейчас я веду свой блог на Github: http://www.mindginative.com/, иногда я могу публиковать здесь в Medium

На работе мы использовали Webpack для нашего стека внешнего интерфейса (TypeScript, AngularJS v1.x, NodeJS, GulpJS + другие библиотеки JS без особых проблем. За последние пару месяцев наш проект на основе Angular2 начал оживать, от простого PoC до пригодного для использования веб-приложения. Хотя мы работали с ранними альфа-версиями Angular2, но мы думали, что все будет хорошо - нам просто нужен минимально жизнеспособный продукт. сообщение ниже начало появляться, и теперь наш простой интерфейс Webpack `require` требует немного внимания.

…node_modules/angular2/typings/node/node.d.ts
error TS2403: Subsequent variable declarations must have the same type. Variable ‘require’ must be of type ‘NodeRequire’, but here has type ‘WebpackRequire’.

Ах, простое исправление !, я думал, что это всего лишь 2 минуты исправления с типами пересечения TypeScript, представленными в версии 1.6:

declare var require: NodeRequire | WebpackRequire

хорошо, что не сработало!

…node_modules/angular2/typings/node/node.d.ts
error TS2403: Subsequent variable declarations must have the same type. Variable ‘require’ must be of type ‘NodeRequire’, but here has type ‘NodeRequire | WebpackRequire’.

Игра в интернетах привела меня к проблеме Github https://github.com/Microsoft/TypeScript/issues/3215. Один из комментаторов указал на использование функциональных возможностей открытого интерфейса TypeScript, которые действуют как переопределение существующего определения типа. Предполагается, что довольно просто изменить файл определения оскорбительного типа, изменив его на `declare var require: any`, однако это файл, отправленный через пакет npm, быстрое исправление может сработать сегодня, но мы этого не делаем ' Я знаю, что после следующей `npm install` ваше исправление все еще будет там.

В любом случае вот обновленный интерфейс:

interface WebpackRequire {
    <T>(path: string): T;
    (paths: string[], callback: (...modules: any[]) => void): void;
    ensure: (paths: string[], callback: (require: <T>(path: string) => T) => void) => void;
}
interface NodeRequire extends WebpackRequire {}
declare var require: NodeRequire;

Я попытался сделать обновленное определение интерфейса немного подробным, чтобы напомнить, что это переопределенный (как я его называю) интерфейс специально для Webpack.

использованная литература