整合 TypeScript

以一个全新创建的 Ember Octane App 为基础介绍如何整合 Typescript

这一部分内容是我录制的 Ember Octane 官方教程系列视频的补充内容,也是我极力推荐给初学者的知识点,即:使用 Typescript 来编写 Ember Octane 应用程序。

关于这个主题我有很多可以谈的,但这一篇的主题聚焦于如何整合 Typescript 到一个新创建的 Ember Octane App 中去。这部分内容以操作为主,且随着时间的推移会有内容不断更新,所以不便于占用视频的宝贵时间。如果你想知道如何安装和配置 Typescript,那这篇文章非常适合。

安装 ember-cli-typescript

ember-cli-typescript 是我们为 Ember Octane App 添加 TypeScript 支持的最佳选择。安装它只需要在项目根路径下执行命令:

$ ember install ember-cli-typescript

这条命令同时还会帮我们安装下列几个依赖包:

  1. ember-cli-typescript-blueprints

  2. typescript

  3. @types/ember

  4. @types/rsvp

  5. @types/ember__test-helpers

  6. @types/ember-data

  7. @types/ember-qunit

  8. @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 格式(可选)

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 文件,内容如下:

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 属性修改为:

.eslintrc.js
parser: '@typescript-eslint/parser',

@typescript-eslint/eslint-plugin 则为我们提供了适合 TypeScript 使用的语法检查规则。

pluginsextends 属性分别修改成:

.eslintrc.js
plugins: ['@typescript-eslint', 'ember'],
extends: [
  'eslint:recommended',
  'plugin:@typescript-eslint/eslint-recommended',
  'plugin:@typescript-eslint/recommended',
  'plugin:ember/recommended',
],

最后,在 overrides 里添加以下几项:

.eslintrc.js
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

最后更新于

这有帮助吗?