TypeScript学习笔记(简记)

120 阅读3分钟

前提

本文是根据B站UP主吴悠讲编程的视频内容来记录的,主要是给自己看看,可以快速入门ts。
视频:BV1gX4y177Kf
大家可以去看一看,我感觉收获挺大的~

TypeScript核心

1. 类型推断

typescript会根据给变量存放的初始值来进行变量类型限定

// 报错
let str = 'abc'
str = 10

2. 类型注解

书写变量时,给变量一个类型的限定

let str: string  = 'abc'
// 预声明
let str: string
str = 'abc'

3. 类型断言

let numArr = [1, 2, 3]
// 断言result是一个number类型
// 注意:需要人工做干预,即确定代码可用,否则可能会报错(比如undefined)
const result = numArr.find(item => item > 2) as number
result * 5

4. 基础类型和联合类型

4.1 基础类型

let v1: string = 'abc'
let v2: number = 10
let v3: boolean = true
let nu: null = null
let un: undefined = undefined

4.2 联合类型

  1. 限制类型
// v4有可能分配为字符串,有可能分配为空
let v4: string | null = null

null默认可以分配给其他类型
注意:使用配置项strictNullChecks则不能随意将null分配给其他类型 2. 限制具体值

// 报错
let v5: 1 | 2 | 3 = 5
// 不报错
let v6: 1 | 2 | 3 = 2

5. 数组、元组、枚举等

5.1 数组

javascrpit中,数组可以存储不同类型的数据

// 不建议
let arr = [1, 2, 3, 'abc']

通过类型来约束整个数组可以存储的数据类型

// 数值数据
let arr: number[] = [1, 2, 3]
// 字符串数组
let arr1: Array<string> = ['a', 'b', 'c']

5.2 元组

元组也可以存储多个数据,但是限定了存储的数据个数以及每个数据的类型

let t1: [number, string, number] = [1, 'a', 2]
t1[0] = 100

当希望某个值是可选时,加上问号

let t1: [number, string, number?] = [1, 'a']

5.3 枚举类型

enum MyEnum {
    A,
    B,
    C
}
// 访问的是一组数据
console.log(MyEnum.A)
console.log(MyEnum.[0])

A取值0,0取值A
相当于js中:

"use strict";
var MyEnum;
(function (MyEnum) {
    MyEnum[MyEnum["A"] = 0] = "A";
    MyEnum[MyEnum["B"] = 1] = "B";
    MyEnum[MyEnum["C"] = 2] = "C";
})(MyEnum || (MyEnum = {}));
console.log(MyEnum.A);
console.log(MyEnum.[0]);

5.4 void类型

void只能被分配undefined值(严格模式)

6. 函数

function MyFn (a: number, b: string): string {
    return a + b 
}

可选参数必须在必选参数后面

function MyFn (a: number, b?: string): string {
    return a + b 
}

特殊:希望给参数设置默认值,则可以在必选参数左侧

function MyFn (a = 10, b: string, c?: boolean, ...rest: number[]): number {
    return 100
}
const f = MyFn(20, 'abc', true, 1, 2, 3)

7. 接口

interface

interface Obj = {
    name: string,
    age: number
}
const obj: Obj = {
    name: 'a',
    age: 10
}

8. 类型别名

a可能是string,也可能是number

let a: string | number = 10

更好的写法:

type MyUserName = string | number
let a: MyUserName = 10
// let a: MyUserName = 'abc'

9. 泛型

function myFn<T>(a: T, b: T): T[] {
    return [a, b]
}
myFn<number>(1, 2)
myFn<string>('a', 'b')
// 简写
myFn('a', 'b')

TypeScript进阶

10. 函数重载(伪重载)

function hello (name: string): string
function hello (age: number): string
function hello (value: string | number): string {
    if (typeof value === 'string') {
        return '你好,我的名字是' + value
    } else if (typeof value === 'number') {
        retutn `你好,我的年龄是${value}`
    } else {
        return '非法格式'
    }
}
hello('abc')
hello(18)

11. 接口继承

可以用于功能复用

interface Parent {
    prop1: string
    prop2: number
}
interface Child extends Parent {
    prop3: string
}
const myObj: Child = {
    prop1: '',
    prop2: 1,
    prop3: ''
}

12. 类的修饰符

class  Article {
    // 必选
    public title: string
    content: string
    // 可选
    aaa?: string
    // 设置默认值
    bbb = 100
    private temp?: string
    protected innerData?: string
    
    // 静态属性
    static author: string
    // 只读
    private static readonly ppp: string = '张三'
    
    constructor (title: string, content: string) {
        this.title = title
        this.content = content
    }
}
const a = new Article('标题', '内容')
Article.author

13. 存取器

class User {
    private _password: string = ''
    
    get password(): string {
        return '$$$'
    }
    set password(newPass: string) {
        this._password = newPass
    }
}
const u = new User()
console.log(u.password)

14. 抽象类

abstract class Animal {
    abstract name: string
    abstract makeSound(): void 
}
class Cat extends Animal {
    name: string = '小猫',
    makeSound(): void {

    }
}

15. 类实现接口

单继承,多实现

interface Animal {
    name: string
    get sound(): string
    makeSound(): void
}
class Dog implements Animal {
    name: string = '小狗'
    get sound() {
        return ''
    }
    makeSound(): void {
        
    }
}

16. 泛型类

class MyClass<T> {
    public value: T
    constructor (value: T) {
        this.value = value
    }
    do (input: T): T {
        console.log('处理数据', this.value)
        return input
    }
}
const myStr = new MyClass<string>('hello')
myStr.do('agg')