约束方式

# 约束方式

  1. 字符串类型

    let str: String = 'abcdef'

  2. 数字类型

    let num: Number = 123;

  3. 布尔类型

    let flag: Boolean = true;

  4. 数组

    let arr: Array<number> = [1, 2, 3];
    let brr: number[] = [1, 2, 3];
    
  5. 对象

    let obj: object = {} // 可以使用这种方式约束但是不够精准。因为对象中存在其他属性
    
  6. null 和 undefined

    null 和 undefined 是其他类型的子类型

# 联合类型

多种类型选择其中一个

配合类型保护进行判断

类型保护:当一个类型进行类型判断后,在判断语句中可以确定变量的类型。

# void 类型

表示一个函数不返回任何东西。

一般不约束变量

# never 类型

表示该函数永远不会结束。

# 字面量类型

let sex: 'man' | 'woman';
// sex = 0 // 会提示只能是 man 或 woman 类型

# 元祖类型(Tuple)

一个固定长度的数组,并且数组中每一项都确定。

let tuple: [string, number]; // 表示 tuple 这个数组只能有两项 并且第一项是字符串,第二项是数组
tuple = ['1',2]

# any 类型

any 类型可以绕过类型检查,any 类型的数据可以赋值给任何类型。

# 类型别名

对一致的一些类型定义名称

type 类型名 = 值;

type gender = '男' | '女'
type User = {
    name: string,
    sex: gender,
    age: number
}
let user: User = {
    name: 'zhang san',
    sex: '女',
    age: 18,
}

# 函数相关约束

函数重载:在函数实现之前,对函数调用的多种情况进行声明

/**
 * 约束 a b 同为数字类型
 * @param a 
 * @param b 
 */
function func(a: number, b: number): number;
/**
 * 约束 a b 同为字符串类型
 * @param a 
 * @param b 
 */
function func(a: string, b: string): string;
function func(a, b): number | string {
    if (typeof a === 'number' && typeof b === 'number') {
        return a * b;
    } else if (typeof a === 'string' && typeof b === 'string') {
        return a + b;
    }
    throw new Error('a and b not number or string')
}

var ret = func(1, 2);
var rets = func('a', 'b');

可选参数:可以在某个参数名后面加上问号,表示该参数可以不用传递。

function test(a: number, b: number): number;
function test(a: number, b: number, c: string): string;
function test(a: number, b: number, c?: string): number | string {
    if (c) {
        return a + b + c;
    } else {
        return a + b;
    }
}
var t1 = test(1, 2);
var t2 = test(1, 2, '3')