Typescript 类型限定

限定类型

  • 变量限定类型
  • 函数限定类型
  • 函数参数限定类型
  • 构造函数后面不需要给定类型(new以后得到对象)
  • 枚举类型、数组类型、元组类型、不限定类型
  • never:无法返回的类型,比如死循环
  • 限定数组元素对象类型,限定对象属性类型
  • 断言类型
  • undefined null

变量类型

//变量限定类型后不能改变变量值类型

var a: Number = 3;

函数类型

函数参数也必须给定类型

函数没有返回值,定义void类型

//当前函数必须由返回值,且返回值必须是number类型
function getNum(): Number {
    //任何变量都必须定义类型
    let a: Number = 1;
    return a;
}

//函数没有返回值,定义void类型
function fn(): void { }

//函数参数也必须给定类型
function argType(a1: Number, a2: String) {
    console.log(a1, a2)
}
argType(1, 2 + "");

数组、元组与枚举

//数组类型,所有元素类型必须相同,不同的话可以用元组
//c语言写法
let list: number[] = [1, 2]
//面向对象
let list2: Array<Number> = [1, 2, 3]

//元组Tuple,相比于数组,元组可以用不同类型
let tuple: [string, number, boolean] = ['a', 1, true]

//枚举
enum STATUS { WALK = "walk", SWIM = "swim" }
console.log(STATUS.WALK)//walk

不限类型与无法返回的类型

//any 不确定的通用类型,进来不要使用
var notsure: any = 1;

//never 无法返回的类型,如死循环

限定数组的对象元素类型 限定对象的属性类型

需要借用构造

//限定对象的属性类型
class ItemVo {
    id: number = 0
    name: string = ""
    price: number = 1
    selected: boolean = false
    constructor(_id: number, _name: string, _price: number, _selected: boolean) {
        this.id = _id
        this.name = _name
        this.price = _price
        this.selected = _selected
    }
}

var objArr:Array<ItemVo>=[
    new ItemVo(1001,'a',35,true),
    new ItemVo(1002,'a',35,true),
    new ItemVo(1003,'a',35,true)
]

断言,强制指定类型

//断言类型 适用于有些类型无法确定的情况
//子类也属于父类类型,因为子类的原型存在父类

import Parent from './a'
import Child from './b'

var arr1:Array<Parent>=[
    new Parent(),
    new Child()
]

for(let i = 0; i < arr1.length; i ++){
    if(arr1[i].constructor === Child){
        //断言,Array装载Parent类型,而Parent没有run方法,但是Child有
        //断言强制认为此元素是Child类型
        (arr1[i] as Child).run();
    }

}