Быстрое обновление 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.
использованная литература
- Https://github.com/Microsoft/TypeScript/issues/3215#issuecomment-103467086
- Https://basarat.gitbooks.io/typescript/content/docs/types/ambient/interfaces.htm
- Http://ronniehegelund.blogspot.co.nz/2013/01/extension-methods-in-typescript.html
- L https://github.com/angular/angular/issues/5807#issuecomment-164678165
- Https://github.com/angular/angular/issues/6266