TS函数
函数:可以被调用的对象
函数的几种写法
    //先写类型再赋值
     type F = {
        (a: number, b: number): number
    }
    let f: F = (a, b) => a + b
    type F1 = (a: number, b: number) => number
    let f1: F1 = (a, b) => a + b
    interface F2 {
        (a: number, b: number): number
    }
    let f2: F2 = (a, b) => a + b
    //先写函数,再获取类型
    const f1 = function (a: number, b: number): number {
        return a + b
    }
    type F1 = typeof f1
    function f2(a: number, b: number): number {
        return a + b
    }
    type F2 = typeof f2
    const f3 = (a: number, b: number): number => {
        return a + b
    }
    type F3 = typeof f3
类型谓词
类型收窄
    type Person = {
        name: string
    }
    type Animal = {
    }
    function f1(a: Person | Animal) {
        if (isPerson(a)) {
            a//类型是Person
        }
    }
    function isPerson(x: Person | Animal): x is Person {
        return 'name' in x
    }
可选参数
    function addEventListener(
        eventType: string, fn: (e: Event, el: Element) => void, useCaptrue?: boolean
    ) {
        if (useCaptrue === undefined) {
            useCaptrue = false
        }
        const element = {} as Element
        const event = {} as Event
        fn(event, element)
        console.log(event, fn, useCaptrue)
    }
    addEventListener('click', (e, el) => { })
珂里化
    const add = (a: number, b: number) => a + b
    const createAdd = (a: number) => (b: number) => a + b
    createAdd(1)(2)
重载(overload)
同名的函数,参数不同(类型不同或者参数个数不同)
    function add(n1: number, n2: number): number
    function add(n1: string, n2: string): string
    function add(n1, n2) {
        return n1 + n2
    }
    add(1, 2)
    add('a', 'b')
    add(1, '2') //报错
    function createDate(n: number): Date;
    function createDate(y: number, m: number, d: number): Date;
    function createDate(a: number, b?: number, c?: number): Date {
        if (a !== undefined && b !== undefined && c !== undefined) {
            return new Date(a, b, c)
        } else if (a !== undefined && b === undefined && c === undefined) {
            return new Date(a)
        } else {
            throw new Error('error')
        }
    }
指定函数的this
    interface Human {
        name: string
        age: number
    }
    function fn(this: Human) {
        console.log(this)
    }
    fn.call({ name: 'tom', age: 18 }) //需要call
    fn() //报错
剩余参数
    function sum(...array: number[]) {
        return array.reduce((n, p) => n + p, 0)
    }
    sum(1)
    sum(1, 2)
    sum(1, 2, 3)
展开参数
    function sum(name: number, ...array: number[]) {
        f(...array)
    }
    function f(...array: number[]) {
        console.log(array)
    }
参数析构
    type Config = {
        url: string,
        method: 'GET' | 'POST'
        data: unknown,
        headers: unknown
    }
    function ajax({ url, method, ...rest }: Config) {
        console.log(url, method)
    }
    //加默认值
    function ajax({ url, method, ...rest }: Config = { url: '', method: 'GET' } as Config) {
        console.log(url, method)
    }
类型推断
TS会自己猜类型
    function add(n1: string, n2: string) {
        return n1 + n2
    }
    let result = add('tom', 'jack').split('') //由于两个规定类型为string的参数相加为string,所以ts推断结果为string,拥有split方法
类型兼容
    interface Human {
        name: string
        age: number
    }
    let tom: Human = { name: 'tom', age: 18, gender: 'f' }//直接赋值会报错
    -----------------------
    let temp = { name: 'tom', age: 18, gender: 'f' } //使用中间变量,会触发TS的类型兼容
    let tom: Human = temp
版权声明:本博客所有文章除特殊声明外,均采用 CC BY-NC 4.0 许可协议。转载请注明出处 Roxas Deng的博客!