TS学习-类型的学习

116 阅读4分钟

1.TS常见知识点

let a = true; // 那么ts会默认认定a变量为布尔类型,相当于let a:boolean = true
let a; // 创建一个变量是不给任何类型,那么ts会默认给他加一个any-->隐式any
// any尽量少使用,any不会有任何ts提示,可以使用unknown||<T>代替
// as类型断言 下面两种写法都是告诉编译器b的类型就是string
a = b as string;
a = <string>b
// 可选类型 表示对象或数组中的某个属性或值可有可无
let a = {name:string,age?:number};
a = {name:"hepeng"}

2.TS常用类型

Function,number,string,boolean,字面量,any(建议少用),unknown(类型安全的any),联合类型(|),且类型(&),类型别名(自定义类型)

// any和unknown的区别  unknown = 类型安全的any
let c: any;
let c1: string;
c1 = c;// 这里不会报错的原就是c为any,不会检测类型,有风险
let c2: unknown;
c2 = "hheh" // c2现在是字符串,但是下面赋值给c1依旧报错,因为c1的本质类型为unknown,因此报错
// c1 = c2;
// 类型断言as,告知编译器某个变量就是某个类型,放心赋值即可
c1 = c2 as string; // 使用类型断言可以解决错误
// 使用泛型同样可以
c1 = <string>c2

3.TS高阶类型

注意:接口类型interface只能定义属性和方法不可以赋值!即接口中的所有方法都是抽象方法

接口的本质就是限制一个类的结构

// TODO 泛型<T>通常用于定义类型不确定的函数或类,其本质就是让ts编译器自动推断传的参数的类型(因为类型不明确)
        function fun1<T>(art: T): T {  // 声明一个类型为泛型T,参数为泛型T,返回值也为泛型T的函数fun1
            return art;
        }
        function fun2<T, K>(art1: T, art2: K): T { // 泛型可以同时指定多个
            console.log(art2)
            return art1;
        }
        fun2<string, number>("hehe", 2)

    // 泛型的继承
        interface myInterface1 {
            length: number;
        }
        function fun3<T extends myInterface1>(art: T): number { // 一个fun的泛型继承自myInterface,此处的泛型T必须作为myInterface1的子类去实现,也就是说必须要有length:number这个属性
            return art.length;
        }
        fun3({ length: 1 })
        
   // TODO 类中的泛型
        class Myclass<T>{ // 创建一个类型为T的类
            name: T;
            constructor(name: T) {
                this.name = name
            }
        }
        const demoTT = new Myclass<string>("heheheh") // 类和函数的泛型定义的时候都写在名字后
        console.log(demoTT.name)
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO type类型别名(自定义类型) -- interface 接口类型
type myType = 1 | 2 | 3  // type常用于定义一个可复用的类型
let ll: myType;
let lll: myType;
// interface常用来定义一个类结构,限制该类中有哪些属性和方法。可以代替type去使用,同时他可以同名合并,type则不行
interface myInterface{
    name:string;
    age:number;
}
interface myInterface{
    gender:string;
    fun():void;
}
// 接口的实现必须要借助implements
class Myinterface implements myInterface{
    constructor(name:string,age:number,gender:string){
        this.name=name;
        this.age=age;
        this.gender=gender
    }
    name:string;
    age:number;
    gender:string;
    fun(){
       console.log('接口类型测试')
    };

}
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO ts高阶类型 void类型 -- never类型
function fn(): number { // 给函数设置返回值为number且必须有返回值,如果不写切没有返回值则默认为void类型的返回值
    return 10;
}
function fn1() { // 这里的返回值则默认为void(表示没有返回值)

}
function fn2(): void { // void表示该函数不能设置返回值,下面写法会报错
    return 123;
}
function fn3(): never { // never表示该直接没有任何返回值,通常和throw error配合使用
    throw new Error("报错了")
}
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO ts高阶类型 对象object的限制
let obj: object; // 这样写没啥用,js中的万物皆对象
// TODO ?指可选属性
let obj1: { name: string, age?: number }; // 对象的约束通常这样写,约束后obj1必须有string类型的name属性,age属性可以有可以没有
obj1 = { name: "hepeng" }
let obj2: { name: string, [propName: string]: any }; // 表示obj2必须有name,但是其他属性随意写
obj2 = { name: "hepeng", a: 1, b: true }
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO ts高阶类型 函数结构的限制
let fun: (a1: number, a2: number) => number
fun = function (a1: number, a2: number) {
    return a1 + a2;
}
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO ts高阶类型 array的限制
let arr: string[]; // 限制数组内只能放字符串
arr = ["a", "b"]
let arr1: Array<string> // 同样限制数组内只能放字符串
arr1 = ["a", "b"]
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO ts高阶类型 tuple元组----固定长度的数组
let arrY: [string, number] // 创建一个长度为2的元组
arrY = ["j", 123] // 元组长度不能多不能少
------------------------------------------------------------------------
------------------------------------------------------------------------
// TODO ts高阶类型 enum枚举----把有限的可能列举出来成为一个对象
enum Gender {
    male = 0,
    female = 1
}
let i: { name: string, gender: Gender };
i = { name: "hepeng", gender: Gender.male }