静态类型检查

FlowTypeScript 这样的静态类型检查器可以在运行代码之前识别某些类型的问题。 他们还可以通过添加自动完成功能来改善开发人员的工作流程。 出于这个原因,对于更大的代码库我们建议使用 Flow 或者 TypeScript 来替代 PropTypes

Flow

Flow 是一个针对 JavaScript 代码的静态类型检查器。它是在Facebook开发的,经常和React一起使用。 它可以让你使用特殊的类型语法来注释变量,函数和React组件,并尽早地发现错误。 您可以阅读 Flow 介绍 来了解基本知识。

为了使用 Flow, 你需要:

  • 将 Flow 添加到您的项目作为依赖项。
  • 确保编译后的代码中去除了 Flow 语法。
  • 添加了类型注释并运行 Flow 来检查它们。

我们将在下面详细解释这些步骤。

在一个项目中添加 Flow

首先,在你的终端里进入到项目目录。你需要执行两条命令。

如果你使用 Yarn, 运行:

yarn add --dev flow-bin

如果你使用 npm, 运行:

npm install --save-dev flow-bin

该命令将最新版本的 Flow 安装到您的项目中。

现在,将 flow 添加到 package.json 中的 "scripts" 部分,以便能够在终端中使用它:

{
  // ...
  "scripts": {
    "flow": "flow",
    // ...
  },
  // ...
}

最后,运行以下命令之一:

如果你使用 Yarn ,运行:

yarn run flow init

如果你使用 npm ,运行:

npm run flow init

此命令将创建您需要提交的 Flow 配置文件。

从编译过的代码中剥离 Flow 语法

Flow 通过使用特殊的语法为类型注释扩展了 JavaScript 语言。 然而,浏览器并不知道这个语法,所以我们需要确保它不会在发送到浏览器的已编译的 JavaScript 包中结束。

确切的做法取决于你用来编译 JavaScript 的工具。

Create React App

如果你的项目是使用 Create React App 建立的,恭喜! Flow 此时已经被默认剥离,所以在这一步你不需要做任何事情。

Babel

注意:

这些说明适用于使用 Create React App 的用户。即使 Create React App 在底层使用 Babel,它已经被配置为理解 Flow。只有那些没有使用 Create React App 的用户才需要跟进下面的步骤。

如果你手动为你的项目配置了 Babel,你将需要为 Flow 安装一个特殊的 preset。

如果你使用 Yarn, 运行:

yarn add --dev babel-preset-flow

如果你使用 npm, 运行:

npm install --save-dev babel-preset-flow

然后将 flow preset 加入你的 Babel 配置。比如,如果你通过 .babelrc 文件配置 Babel,它可能会如下所示:

{
  "presets": [
    "flow",
    "react"
  ]
}

这将会让你可以在你的代码中使用 Flow 语法。

注意:

Flow 不需要 react preset,但他们经常在一起使用。 Flow 本身就理解 JSX 语法。

其他生成设置

如果你既不用 Create React App 也不用 Babel,你可以使用 flow-remove-types 来去除类型注释。

运行 Flow

如果你遵循了上述的说明,你应该能够在第一次就运行 Flow。

yarn flow

如果你使用 npm, 运行:

npm run flow

你应该会看到一条这样的消息:

No errors!
✨  Done in 0.17s.

添加 Flow 类型注释

默认情况下, Flow 仅检查包含此批注的文件:

// @flow

通常它被放置在文件的顶部。 尝试将其添加到项目中的某些文件中,然后运行 yarn flownpm run flow 来查看 Flow 是否已经发现了一些问题。

也有一个选择可以强制 Flow 不考虑注释检查所有文件. 对于现有的项目它可能太繁琐了,但对于一个新项目如果你想完全用 Flow 来组织,那会是合理的。

现在你们都准备好了! 我们建议查看以下资源以了解有关 Flow 的更多信息:

TypeScript

TypeScript 是一门由微软开发的编程语言。 它是 JavaScript 的一个类型超集,包含它自己的编译器。 作为一种类型化语言,Typescript 可以早在您的应用程序上线之前在构建时发现错误和错误。 你可以在这里了解更多关于在 React 中使用 TypeScript 的知识。

要使用 TypeScript,你需要:

  • 将 Typescript 添加为您的项目的依赖项
  • 配置 TypeScript 编译器选项
  • 使用正确的文件扩展名
  • 为你使用的库添加定义

让我们来详细介绍一下。

在一个项目中添加 TypeScript

这一切都始于在终端中运行一个命令。

如果你使用 Yarn, 运行:

yarn add --dev typescript

如果你使用 npm, 运行:

npm install --save-dev typescript

恭喜! 您已经将最新版本的 TypeScript 安装到您的项目中。 安装 TypeScript 让我们可以访问 tsc 命令。 在配置之前,让我们将 tsc 添加到 package.json 中的 “scripts” 部分:

{
  // ...
  "scripts": {
    "build": "tsc",
    // ...
  },
  // ...
}

配置 TypeScript 编译器

除非我们告诉编译器要做什么,否则它对我们将毫无用处。在 TypeScript 中,这些规则定义在一个叫 tsconfig.json 的特殊文件中。运行如下命令生成该文件:

tsc --init

看看现在生成的 tsconfig.json,你可以看到有很多选项可以用来配置编译器。 有关所有选项的详细说明,请点击这里

在许多选项中,我们会看到 rootDiroutDir。编译器将以真实的情况接收 typescript 文件然后生成 javascript 文件。然而我们不想混淆源文件和编译后的输出。

我们将通过两个步骤解决这个问题:

  • 首先,让我们像这样安排我们的项目结构。我们将所有的源代码放在 src 目录中。
├── package.json
├── src
│   └── index.ts
└── tsconfig.json
  • 接下来,我们会告诉编译器源代码在哪以及编译后输出该放哪。
// tsconfig.json

{
  "compilerOptions": {
    // ...
    "rootDir": "src",
    "outDir": "build"
    // ...
  },
}

非常棒!现在当我们运行构建脚本时编译器将会将生成的 javascript 代码输出到 build 文件夹。TypeScript React Starter 提供了一个带有一套配置的 tsconfig.json 文件让你上手。

通常,您不希望将生成的JavaScript保留在源代码管理中,因此请确保将生成文件夹添加到 .gitignore 中。

文件扩展名

在 React 中,你最有可能在 .js 文件中编写你的组件。在 TypeScript 中我们有两个文件扩展名:

.ts 是默认的文件扩展名, .tsx 是一个为包含 JSX 代码使用的特殊扩展名。

运行 TypeScript

如果你遵循了如上的说明,你应该能够第一次就成功运行 TypeScript。

yarn build

如果你使用 npm, 运行:

npm run build

如果你没有看到输出,这意味着它完全编译成功了。

类型定义

为了能够显示来自其他包的错误和提示,编译器依赖于声明文件。 声明文件提供了关于库的所有类型信息。 这使我们能够在我们的项目中使用像那些在 npm 中的 JavaScript 库。

对于一个库来说,主要有两种方式获得声明:

Bundled - 该库捆绑了自己的声明文件。 这对我们来说很好,因为我们所要做的就是安装这个库,我们便可以马上使用它。 要检查一个库是否有 bundled 类型,请在项目中查找 index.d.ts 文件。 有些库会在 package.json 文件的 typings 或者 types 属性中指定它。

DefinitelyTyped - DefinitelyTyped 是一个不包含声明文件的库的声明库。这些声明是由微软和开源贡献者提供的。 例如 React 并不捆绑它自己的声明文件。 相反,我们可以从 DefinitelyTyped 中获得。 为此,请在终端中输入此命令。

# yarn
yarn add --dev @types/react

# npm
npm i --save-dev @types/react

局部声明 有时你想使用的包不包含声明,也不能在 DefinitelyTyped 上使用。 在这种情况下,我们可以有一个本地声明文件。 为此,请在源目录的根目录中创建一个 declarations.d.ts 文件。 一个简单的声明可能是这样的:

declare module 'querystring' {
  export function stringify(val: object): string
  export function parse(val: string): object
}

和 Create React App 一起使用 TypeScript

react-scripts-ts 自动配置了一个 create-react-app 项目支持 TypeScript。你可以像这样使用:

create-react-app my-app --scripts-version=react-scripts-ts

请注意它是一个第三方项目,而且不是 Create React App 的一部分。

你也可以尝试 typescript-react-starter

你已经准备好写代码了!我们建议查看以下资源来了解有关 TypeScript 的更多信息:

Reason

Reason 不是一种新的语言; 这是一个新的语法和工具链,由测试语言 OCaml 提供支持。 Reason 使 OCaml 成为了面向 JavaScript 程序员的熟悉语法,而且迎合现有已知的 NPM/Yarn 工作流。

Reason 是在 Facebook 开发的,并且在其一些产品如 Messenger 中使用。它仍然具有一定的实验性质,但它有由 Facebook 维护的专门的 React 绑定 和一个充满活力的社区

Kotlin

Kotlin 是由 JetBrains 开发的一门静态类型语言。其目标平台包括 JVM, Android, LLVM 和 JavaScript

JetBrains 专门为 React 社区开发和维护了几个工具: React bindings 以及 Create React Kotlin App。 后者可以帮助您开始使用Kotlin 构建 React 应用程序,而不需要构建配置。

其他语言

请注意,还有其他静态类型的语言可以编译成 JavaScript,因此是 React 兼容的。 例如,和 elmish-react 一起使用的 F#/Fable。查看他们各自的网站以获取更多信息,并欢迎添加更多和与 React 一起工作的静态类型的语言到这个页面!