整合 TypeScript
以一个全新创建的 Ember Octane App 为基础介绍如何整合 Typescript
安装 ember-cli-typescript
ember-cli-typescript 是我们为 Ember Octane App 添加 TypeScript 支持的最佳选择。安装它只需要在项目根路径下执行命令:
$ ember install ember-cli-typescript
这条命令同时还会帮我们安装下列几个依赖包:
ember-cli-typescript-blueprints
typescript
@types/ember
@types/rsvp
@types/ember__test-helpers
@types/ember-data
@types/ember-qunit
@types/qunit
其中以 @types
开头的六个是为了给 Ember.js 框架(包括 Ember Data 在内)提供配套的类型声明文件。
删除不兼容的 ember-cli-typescript-blueprints(暂时)
Blueprints 是 ember-cli 框架中的一个机制,它的作用给 ember generate xxx
命令提供默认的文件模板。当我们使用 TypeScript 之后,原则上我们通过 ember generate
创建出的文件也应该是 .ts
文件,它们的默认内容也应该和 .js
有所区别。
但因为 Ember Octane 刚刚发布不久,目前最新版本的 ember-cli-typescript(v3.1.3)还没有完全做好兼容性处理,因此默认安装的 ember-cli-typescript-blueprints 应该删除掉,以确保 ember generate
命令可以生成正确的文件内容(文件的类型则暂时需要我们自行修改成 .ts
)。可以执行以下命令:
$ yarn remove ember-cli-typescript-blueprints
# 或
$ npm uninstall ember-cli-typescript-blueprints
将缺省创建的文件转换成 .ts
格式(可选)
.ts
格式(可选)TypeScript 本质上是 JavaScript 的超集,所以一个 TypeScript 项目中同样可以使用 .js
文件。新创建的 Ember Octane App 里有几个默认的 .js
文件,你可以把它们转成 .ts
格式——当然这一步不是必须的!
以下是转换后的文件内容及一些说明:
import Application from '@ember/application';
import Resolver from 'ember-resolver';
import loadInitializers from 'ember-load-initializers';
import config from 'super-rentals/config/environment';
export default class App extends Application {
modulePrefix = config.modulePrefix;
podModulePrefix = config.podModulePrefix;
Resolver = Resolver;
}
loadInitializers(App, config.modulePrefix);
添加缺失的类型声明
此文件在更改为 .ts
类型之后,会报如下图的错误:

这是因为 ember-resolver
没有匹配的类型声明,ember-cli-typescript 里也没提供。
解决办法,添加 types/ember-resolver/index.d.ts
文件,内容如下:
declare module 'ember-resolver';
使用绝对路径引用模块
另外在第 4 行,我将以前的:import config from './config/environment';
改成了 import config from 'super-rentals/config/environment';
这一改动也不是必须的,但至少在 config 这个例子中我推荐使用绝对路径。关于这一点所产生的影响,请继续往后看——
处理语法检查错误
现在我们已经把所有缺省文件都转换成了 .ts
类型并且修复其中产生的错误,然而此时若打开 types/
目录下的各种 .d.ts
文件,你会发现多出一些错误(假设你使用 VS Code 编辑器的话)。
这些错误其实是和 Ember Octane 使用的语法检查插件 ESLint 有关系。ESLint 是专为 JavaScript 代码提供语法检查的工具,但 TypeScript 作为 JavaScript 的超集,有一些额外的语法是 ESLint “不认识“的,所以就会报这样一些错误。
接下来,我们来配置 ESLint 让它和 TypeScript 协同工作。
首先,我们要安装两个额外的包:
$ yarn add @typescript-eslint/parser @typescript-eslint/eslint-plugin --dev
# 或
$ npm install @typescript-eslint/parser @typescript-eslint/eslint-plugin --save-dev
其中 @typescript-eslint/parser
是语法解析器,帮助 ESLint “认识“ TypeScript 中那些新的语法元素。
在 .eslintrc.js
文件中,将 parser
属性修改为:
parser: '@typescript-eslint/parser',
而 @typescript-eslint/eslint-plugin
则为我们提供了适合 TypeScript 使用的语法检查规则。
将 plugins
和 extends
属性分别修改成:
plugins: ['@typescript-eslint', 'ember'],
extends: [
'eslint:recommended',
'plugin:@typescript-eslint/eslint-recommended',
'plugin:@typescript-eslint/recommended',
'plugin:ember/recommended',
],
最后,在 overrides
里添加以下几项:
orverrides: [
{
files: '*.js',
rules: {
'prefer-const': 'warn',
'@typescript-eslint/camelcase': 'warn',
'@typescript-eslint/no-var-requires': 'off',
'@typescript-eslint/explicit-function-return-type': 'off',
},
},
{
files: 'types/**/*.d.ts',
rules: {
'@typescript-eslint/no-empty-interface': 'off',
},
},
// ...
]
这样,就能还你一个清清爽爽的 TypeScript Ember Octane Application 啦!
配置开发环境
VS Code
最后更新于
这有帮助吗?