什么是 TypeScript
TypeScript 简称 TS,是微软开发的 javascript 加强版,顾名思义就是带了 type 的 javascript。它的很多特性可以帮助我们写出更加健壮的代码,弥补 javascript 在开发大型项目时的先天不足。
TypeScript 允许你以 接口 的形式定义复杂的类型。当你要在应用程序中使用复杂的 对象或数组(例如包含其他属性的对象)时,会进行严格的静态类型审查,增加健壮性。
开始一个 demo
接下来让我们来使用 antd 开发一个功能完备的 crud 应用程序来带我们认识一下 TypeScript 的优越之处。在 umi 中内置了 TypeScript 的 Loader,你可以直接新建 .tsx 或者 .ts 文件来写 TypeScript 代码。demo 地址
首先我们安装依赖包
cnpm install tslint tslint-config-prettier tslint-react @types/react @types/react-dom --save
然后我们需要新建 tsconfig.json 和 tslint.json文件,tsconfig.json 来声明这是一个 TypeScript 项目,并且进行配置。详细配置可以参考官网,我们可以直接直接输入如下内容:
{"compilerOptions": {"outDir": "build/dist","module": "esnext","target": "es2016","lib": ["es6", "dom"],"sourceMap": true,"jsx": "react","allowSyntheticDefaultImports": true,"moduleResolution": "node","rootDir": "src","forceConsistentCasingInFileNames": true,"noImplicitReturns": true,"suppressImplicitAnyIndexErrors": true,"noUnusedLocals": true,"experimentalDecorators": true},"exclude": ["node_modules","build","scripts","acceptance-tests","webpack","jest","src/setupTests.ts","tslint:latest","tslint-config-prettier"]}
tslint 类似 eslint 是一个代码风格检查器。tslint.json我们可以直接使用如下配置:
{"extends": ["tslint:latest", "tslint-react", "tslint-config-prettier"],"rules": {"no-var-requires": false,"no-submodule-imports": false,"object-literal-sort-keys": false,"jsx-no-lambda": false,"no-implicit-dependencies": false}}
为了增加使用体验,建议一并安装 vscode tslint 插件。
我们可以先做一个简单的 demo 来感受一下 TypeScript 的魅力。首先在 src/page 新建一个 Demo.tsx.
在其中定义一个无状态组件 Hello。
import React from 'react';const Hello = ({ name }) => <div>Hello,{name}</div>;
接下来我们使用它,
const App = () => <Hello />;export default App;
我们发现他抛出了如下错误 :
不能将类型“{}”分配给类型“{ name: any; }”。类型“{}”中缺少属性“name”。
因为我们使用了 name,Typescript 认为他是必填参数。如果不存在便认为程序错误,并造成编译失败。这可以帮助我们避免很多低级错误。
我们还可已将 name 使用 SFC 进一步约束,规定 name 为 string 类型,来增加健壮性。
const Hello: React.SFC<{ name: string }> = ({ name }) => (<div>Hello,{name}</div>);
我们也可以使用 Class 语法来声明组件,代码如下:
class Message extends React.Component<{message: string;}> {public render() {return <div>{this.props.message}</div>;}}
我们可以通过 <> 的第一个参数来指定 props 的类型。通过第二个参数来指定 state 的类型,代码如下:
class Message extends React.Component<{message: string;},{count: number;}> {constructor(props) {super(props);this.state = {count: 0,};}public render() {return (<div>{this.props.message}{this.state.count}</div>);}}
在这里,我们定义了一个 包含 count 的 state ,count 的类型为 number。然后在类 constructor 内部初始化 state。其余使用方式与 javascript 中相同。
我们可以自行修改 count,
public increment = () => {const { count } = this.state;this.setState({count: count + 1});};
并且将其绑定到 dom 上,
public render() {return (<div onClick = {this.increment}>{this.props.message}{this.state.count}</div>);}
使用 Message 组件:
const App = () => <Message message="点击"/>;export default App;
