Typescript
- 静态类型风格的类型系统
- javascript的超集
- 从es6到es10甚至是esnext的语法支持
- 类型检查、自动补全类型方法
- ts的思想就是获得类型
//原始类型
//数组类型
let arrOfNumber : number[] = [1,2,3]
//元组类型
let user : [string,number] = ['viking',20]
//ts中凡事在冒号后面的内容,都是在声明类型,和实际的代码逻辑没有关系
const a1 :(x:number,y:number) => number
interface 接口
- 是一个约束
- 对对象的形状(shape)进行描述
- Duck Typing(鸭子类型)
// readonly 类似与const,但是它是约束属性
// ? 可选
interface IPerson {
readonly id: number;
name: string;
age?: number;
}
let viking: Person = {
id: 1,
name: "custom",
age: 20,
};
function 函数
- 约束输入和输出
function sum(x: number, y: string, z?: number): string {
return x + y;
}
let res = sum(1, "2");
// 冒号后面都是声明类型
let add2 :(x: number, y: string, z?: number)=> string = sum
// interface 声明函数类型
// 用键值对应输入输出
interface ISum{
(x: number, y: string, z?: number):string
}
union types联合类型
let types : number | string
types = 1
types = 'str'
交叉类型
interface IName{
name:string
}
type IPerson = IName & { age:number}
let person:Iperson = { name:'abc',age:10}
as 类型断言
function get( x:string | number):number{
let str = x as string
return str.lengh
}
类
访问修饰符
//private 只有当前类内部能调用
//protected 只有子类能调用
//readonly 只能读不能写
enum 枚举
enum Direction{
up,
down,
left,
right
}
console.log(Direction.down) // 1
console.log(Direction[2]) // left
内部是通过双向赋值实现
- 使用常量枚举,可以提升性能
generics 泛型
- 可以灵活约束参数的类型
function echo<T>(arg:T):T{
return arg
}
let a = echo(111)
function ec2 <T,U> (arg:[T,U]):[U,T]{
return [arg[1],arg[0]]
}
let b = ec2([2,'222'])
约束泛型
function ec2 <T,U> (arg:[T,U]):[U,T]{
return [arg[1],arg[0]]
}
let b = ec2([2,'222'])
interface hasLength {
length:number|string
}
function a1<T extends hasLength>(arg:T):T{
console.log(arg.length)
return arg
}
let c = a1([1,2,3])
let d = a1({length:'11'})
let e = a1('555')
// Promise
interface GithubResp {
data: object;
code: number;
}
function gitApi<T>(url: string): Promise<T> {
return fetch(url).then((resp) => resp.json());
}
gitApi<GithubResp>('git.user').then(resp => {
})
在 类 和 接口(interface)中的应用
- 创建一个拥有特定类型的容器
//类
class Queue<T> {
private data = [];
push(item:T) {
return this.data.push(item);
}
pop() {
return this.data.pop();
}
}
let f = new Queue<number>() //
let g = f.push(111)
//接口
interface test<T,U>{
num:T,
num2:U
}
let h :test<number,string> = {num:1,num2:'abc'}
let i :test<string[],number> = {num:['a,b'],num2:111}
// 两种写法
let j :number[] = [1,2,3]
let k :Array<number> = [2,4]
类型别名
- 灵活,宽泛
- 创建一个简单的写法
let sum : (x:number, y:number) => number
const res = sum(1,2)
//
type plus = (x:number, y:number) => number
let sum2:plus
const res2 = sum2(2,3)
//
const str:'name' = 'name'
const num: 1 = 1
type dir = 'up' | 'down' | 'left'
let where :dir = 'up'
//
//交叉类型
interface IName{
name: string
}
type IPerson = IName & {age:number}
let person:IPerson = {name:'1',age:2}
声明文件
- 声明语句一般放在 .d.ts 文件中
// jQuery.d.ts
// declare 并不是声明一个变量,只是定义一个变量的类型,只是用于编译时候的检查
declare var jQuery:(selector:string)=>any
针对不同库,社区有对应的声明文件,可直接安装,或者本身已经包含
内置类型
- 提供一些方便的功能