TypeScript学习笔记(一)

1.基础类型:

(1) boolean、number、string 类型

let num: number = 0;
let str: string = "1";
let str1: string = `${str}2`
let flag: boolean = false;

(2) undefined 和 null 类型

let u: undefined = undefined;

let n: null = null;

undefined 和 null 可以是任何类型的子类型,也就是说,你可以将 undefined 和 null 赋值给任何类型

let unum: number = undefined

let nstr: string = null

(3) any、know 和 void 类型

any 类型

当不清楚用什么类型时,可以使用 any 类型,这些值可能来源于动态内容,比如用户的输入和第三方引入库

let notSure: any = false;

notSure = "4";

notSure = 2;

notSure = undefined;

notSure = null;

也可以随便调用属性和方法

notSure.name

notSure.getName()

不建议使用 any,不然就丧失了 TS 的意义。

unknown 类型

不建议使用 any 类型,当不知道是什么类型时可以使用 unknown 类型,其定义和 any 有点像,但是使用unknown做任何事情都是不合法的。

举例:

function add(param:any){

    return param / 2

}

虽然能编译通过,但是并没有暴露出预期想要的效果,万一传入的 param 不是 number 类型,就达不到预期想要的效果

function add(param:unknown){

    return param / 2 // 因为不知道 param 类型,所以会标红报错

}

修改:

function add(param: unknown) {

    return param as number / 2

}

void 类型

void 类型与 any 类型相反,它表示没有任何类型,当没有任何返回值时,可以使用 void

function fn(): void {

    console.log("你好呀,欢迎学习ts")

}

(4) never 类型

never 类型表示永不存在值的类型

① 一个永不会有返回值的函数,即死循环
function fo():never{

    while(true){}

}
② 总会抛出错误的函数
function bar():never{

    throw new Error()

}
③ 由于 never 类型仅能被赋值给 never 类型,所以也可用于全面性检查
type Value = number | string | boolean

const processValue  = (value:Value) =>{

    if(typeof value === "number"){

        // 在这个判断中,value的类型被细化为number

        console.log(value)

    }else if(typeof value === "string"){

        // 在这个判断中,value的类型被细化为string

        console.log(value)

    }else{

        // 在这个分支中,value 的类型被细化为 boolean 类型,因为 value 不可能同时为 string 和 number

        // 此时,把 value 赋值给一个显示声明了 never 类型的变量 n 就会报错

        const n:never = value // 不能将类型“boolean”分配给类型“never”。

    }

}

(5) 数组类型

let list:number[] = []

list = [1,2,3,"4"] // 仅为 number 类型,故会报错

list.push("str") // push时类型对不上也会报错

(6) 元组类型

如果想要push不一样的类型可以使用元组类型

let arr:[number,string] = ["1","2"] // 写错类型会报错

let arr:[number,string] = [1,"2","3"] // 越界也会报错

push时不会报错越界错误

let arr:[number,string] = [1,"2"]

arr.push(4)

arr.push("str")

2.函数类型

TS定义函数类型需要定义输入参数类型和输出类型

输出类型也可以忽略,因为TS会根据返回语句自动推断返回类型

function add(x:number,y:number):number{

    return x + y

}

没有返回值时,默认返回void类型

function welcome():void{

    console.log("Welcome!")

}

(1) 函数表达式写法

let z = (x:number,y:number):number => {
    return x + y
}

(2) 可选参数

参数后面加个问号,代表该参数是可选的

function add(x:number,y:number,z?:number):number{
    return x + y
}


add(1,2)
add(1,2,3)

可选参数要放在函数入参的最后面,不然会报错

function add(x:number,y?:number,z:number):number{
    return x + y
}

(3) 默认参数

function add(x:number,y:number = 100){
    return x + y
}

add(100) // 200

默认参数可以不放在入参的最后面,但必须传入明确的 undefined 值来获得默认值

function add(x:number = 100,y:number):number{
    return x + y
}

add(100) // 报错,因为会判定只传了 x 而没传 y
add(undefined,100) // 200

(4) 函数赋值

在TS中函数不能随便赋值,会报错

let add2 = (x:number,y:number):number =>{
    return x + y
}

add2 = "123" // 不能将类型“string”分配给类型“(x: number, y: number) => number”。

可以用下面的方法将 add2 赋值给 add3

let add2 = (x: number, y: number): number => {
    return x + y
}

let add3 = add2 // 被解析为:let add3: (x: number, y: number) => number

(5) 函数重载

函数重载是指两个函数名称相同,但是参数个数或者参数类型不同。他的好处显而易见,不需要把相似功能的函数拆分成多个函数名称不同的函数。

① 不同参数类型

比如我们实现一个 add 函数,如果传入参数都是数字,就返回数字相加,如果传入参数都是字符串,就返回字符串拼接

function add(x: number[]): number

function add(x: string[]): string

function add(x: any[]): any {

    if (typeof x[0] === 'string') {
        return x.join()
    }

    if (typeof x[0] === 'number') {
        return x.reduce((acc, cur) => acc + cur)
    }

}

在 TS 中,实现函数重载,需要多次声明这个函数,前几次是函数定义,列出所有的情况,最后一次是函数实现,需要比较宽泛的类型,比如上面的例子就用到了 any。

② 不同参数个数

假设这个 add 函数接受更多的参数个数,比如还可以传入一个参数 y,如果传了y,就把 y 也加上或拼接上,就可以这么写

function add(x: number[]): number

function add(x: string[]): string

function add(x: number[], y: number[]): number

function add(x: string[], y: string[]): string

function add(x: any[], y?: any[]): any {

    if (Array.isArray(y) && typeof y[0] === 'number') {
        return x.reduce((acc, cur) => acc + cur) + y.reduce((acc, cur) => acc + cur)
    }

    if (Array.isArray(y) && typeof y[0] === 'string') {
        return x.join() + ',' + y.join()
    }

    if (typeof x[0] === 'string') {
        return x.join()
    }

    if (typeof x[0] === 'number') {
        return x.reduce((acc, cur) => acc + cur)
    }

}


console.log(add([1, 2, 3]))      // 6
console.log(add(['lin', '18']))  // 'lin,18'
console.log(add([1, 2, 3], [1, 2, 3])) // 12
console.log(add(['lin', '18'], ['man', 'handsome'])) // 'lin,18,man,handsome'

其实写起来挺麻烦的,后面了解泛型之后写起来会简洁一些,不必太纠结函数重载,知道有这个概念即可,平时一般用泛型来解决类似问题。


本文学习基于【1.9W字总结

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值