什么是 Typescript
typescript 是一个 javascript 的超集。在传统的 javascript 中,整个语言都是若类型的,而 typescript 提供了一种强类型的规范,并且实现了接口,模块化,等功能。语法上 es6 和它比较接近,如果你之前比较熟悉 es6 的话可以轻松上手。
基本类型
在 javascript 中类型一共有,number,string,boolean,null,undefined,object。在 typescript 中又新增了一些类型
元组 Tuple
元组类型允许表示一个已知类型和元素的数组,各元素类型不必相同
tuple 在赋值时必须按照定义的类型,如果不符合就会报错。
1 | let x: [number, string] |
tuple 可以通过索引来找到元素
1 | console.log(x[0].substr(1)) // OK |
当访问一个越界的元素会用联合类型替代
1 | x[3] = '1' //ok 赋值的类型可以是number||string |
枚举 enum
enum 可以给一组数值定义一些友好的编号。同时提供了 value => key 的映射关系
1 | // 从一开始编号 |
Void
它表示没有任何类型。 当一个函数没有返回值时,你通常会见到其返回值类型是 void:
1 | function warnUser(): void { |
any
表示任意类型。编程时有些时候并不清楚类型,any 这时候是个好的选择。Object 有相似的作用,但是 Object 类型的变量只是允许你给它赋任意值 - 但是却不能够在它上面调用任意的方法,即便它真的有这些方法
类型断言
类型断言(Type Assertion)可以用来手动指定一个值的类型。有时我们并不确定数据类型,但确实需要调用一些方法,比如 tostring,这时 typescript 会报错
1 | function getLength(something: string | number): number { |
这时我们可以使用类型断言去强制转换他的类型,可以使用尖括号和 as 两种方法
1 | ;(<string>something).length |
定义类型
typescript 允许给变量或函数返回值定义类型,如果不符合报错就会报错,这使得 js 变成强类型语言
1 | let a:string = ''//a必须是string类型 |
##接口
typescript 的接口可以规定你的代码遵守的一个规则
1 | interface Person { |
Person 会约束创建的变量二者的形状必须一致,也就是必须包含 name,age 两个属性,并且类型保持一致
如果需要定义不确定的属性,可以使用问号
1 | interface Person { |
接口约束函数类型
1 | interface SearchFunc { |
接口约束类
1 | interface ClockInterface { |
泛型
当你不确定具体的类型时,我们会想到使用 any 来约束类型,但是有时这也满足不了我们的要求,例如我想写一个输入和返回类型都相同的函数:
1 | function identity(arg: any): any { |
any 是任意类型,所以不能保证前后的一致性,这时我们可以使用泛型
1 | function identity<T>(arg: T): T { |
typescript+react
1 | import * as React from 'react' |