我是TypeScript的新手,我已经有一段时间没有做过任何严肃的JavaScript开发了,所以我可能错过了一些显而易见的东西。
我尝试在Angular 1应用程序中使用TypeScript。
我使用的是Angular 1.6.5,Moment 2.17.1和TypeScript 2.17.1。我从npm @types\angular
包中安装了Angular typings。Angular的Intelligisense等正在VS Code中工作。
我已经在GitHub上发布了示例代码:https://github.com/kevinkuszyk/moment-angular-typescript
第一个错误
我的示例应用程序在浏览器中运行,但TypeScript编译器抱怨它找不到Moment:
app/controller.ts(3,20): error TS2503: Cannot find namespace 'moment'.
app/controller.ts(6,30): error TS2304: Cannot find name 'moment'.
字符串
尝试使用/编译器指令
为了解决这个问题,我尝试添加以下///
编译器指令:
/// <reference path="../node_modules/moment/moment.d.ts" />
型
但这并不能修复TypeScript编译器:
app/controller.ts(5,20): error TS2503: Cannot find namespace 'moment'.
app/controller.ts(8,30): error TS2304: Cannot find name 'moment'.
型
导入时刻
接下来,我尝试使用他们文档中的说明导入Moment:
import * as moment from 'moment';
型
但这使得TypeScript产生了不同的错误:
app/controller.ts(13,5): error TS2686: 'angular' refers to a UMD global, but the current file is a module. Consider adding an import instead.
型
导入Angular
我还引进了Angular。这修复了TypeScript:
import * as angular from "angular";
型
但现在该应用程序不能在浏览器中运行:
Uncaught ReferenceError: require is not defined
at controller.js:2
型
使用Require.JS
最后我尝试添加Require.JS,但这只会导致一个不同的运行时错误:
Uncaught Error: Module name "moment" has not been loaded yet for context: _. Use require([])
http://requirejs.org/docs/errors.html#notloaded
at makeError (require.js:168)
at Object.localRequire [as require] (require.js:1433)
at requirejs (require.js:1794)
at controller.js:2
型
问题
1.我错过了什么明显的东西吗?
1.引用npm主包附带的d.ts
文件,而不是单独的@types
包,最佳实践是什么?
1.如何在不使用外部模块加载器的情况下使其工作?
3条答案
按热度按时间nxagd54h1#
看起来这是Moment的
d.ts
文件的已知问题(请参阅问题#3763、#3808和#3663)。当我们等待官方修复时,这对我起了作用。
变更:
字符串
对此:
型
cu6pst1q2#
尝试在
tsconfig.json
文件中显式声明@types
作用域包以键入Root:字符串
确保类型定义正确安装在
node_modules/@types/...
中,并且TypeScript编译器是最新的。9jyewag03#
我试图非常缓慢地将一个过时的项目提升到现代标准,所以我努力尝试让其他解决方案工作,而同样的问题间歇性地发生在我身上。
最终,我决定用一个维护的替代品来替换Moment,正如Moment网站上所建议的那样:https://momentjs.com/docs/#/-project-status/
我强烈建议任何阅读这篇文章的人也这样做。这一刻很棒,但该说再见了。