TypeScript总结

TypeScript notes:🤓🤓🤓

前沿:为什么要学习typescript?🤓😼😼

假设有一个需求,求一个两数之和的函数

function(a,b){
	return a+b
}

我们本意:a,b两个数分别为整数,然后返回的值是两个数字的合数。但如果我们传入的变成了一个字符串。返回的将是一个字符串拼接的数字。但我们也可以手动来检查类型定义。

function add(a, b) {
    if (typeof a !== 'number' || typeof b != 'number') {
        throw new Error("类型错误")
    }
    return a + b
}
console.log(add('1', 2));

但如果这样多了,会大大地增加我们的内存开销。反正检查类型是在开发阶段用的,那么,我们为什么不用一个检查工具呢?这个时候,typescript就横空出示了!!!

可以这样理解,typescript就是一个辅助我们开发的检查工具。浏览器运行不了ts,最终还是要将ts编译成js。

1.静态类型定义😼

限制基础类型:

let a: number = 19
let b: string = "121"
let c: boolean = true
let d: undefined
let e: null = null
let f: any=21123h

数组限制:😼

​ 存放数组

想要一个数组里面所有元素为一个指定类型

​ 有两种方式:

let arr: number[] = [1, 2, 3, 5, 6]
let arr1: Array<string> = ['1', '2', '3']

数组每个元素指定类型

​ 利用元祖写法

let arr2:[number,string]=[18,'jack']

对象限制写法😼

有两种方式的写法:

​ 正常写法:

let a: { x: number, y: number } = {
    x: 10,
    y: 20
}

​ 接口写法:

interface kang {
    x: number,
    y: number
}

let a: kang = {
    x: 10,
    y: 20
}

枚举😼

理解为对象的双重取值,key<---->value可以相互取值。

enum COLOR { red, green }
console.log(COLOR.red);//0
console.log(COLOR.green);//1
console.log(COLOR[1]);//green
console.log(COLOR[2]);//undefined

函数:😼

基本用法😼
function width(a: number, b: number): string {
    return a + b + 'px'
}
console.log(width(100, 200));

数组解构赋值😼
function add([a, b]: number[]): number {
    return a + b
}
function add2([a, b]: Array<number>): number {
    return a + b
}
function add3([a, b]: [number, number]): number {
    return a + b
}
console.log(add([1, 2, 34, 5]));
console.log(add2([1, 2, 34, 4]));
console.log(add3([1, 2]));
省略号赋值😼

function addAll(a: number, b: number, ...c: Array<number>): number {
    return a + b + c.reduce((a, b) => a + b)
}
console.log(addAll(1, 2, 3, 4, 5, 6, 7, 8, 9, 10));

对象解构😼😸

就采用对象的规则:普通写法,接口写法


2.箭头函数😸😸😸

箭头函数变量如果为一个的时候,建议不要简写,ts中不能定义类型,应当如下:

const self = (a: number): string => a + 'px'

另一种方法定义箭头函数类型

let a: (x: number, y: number) => number = (x, y) => {
    return x - y
}

3.interface😸😸😸

限制函数类型:😸

interface mathFn {
    (x: number, y: number): number
}

将箭头函数的 ------> 改写成 :

对象当做函数参数来限制😸😸

interface myRule {
    name: string,
    age: number
}

let a: (p: myRule) => string = (p) => {
    return `名字为${p.name}\t\t\t年龄为${p.age}  `
}

或类型😸

interface my {
    name: string,
    age: number | string
}

可有可无😸

interface my {
    name: string,
    age: number | string,
    hobby?: string
}

接受任意个对象,对于某些对象有限制😸

interface my {
    name: string,
    age: number | string,
    hobby?: string,
    [props: string]: any
}
let obj: my = {
    name: "111",
    age: 10,
    hobby: '王者荣耀',
    status: 'shadiohsa',
    asusao: '12wnsdklnjas'
}

函数:😸

interface P {
    name: string,
    age: number,
    say(): void
}
let obj: P = {
    name: "sdoakoodj",
    age: 10,
    say() {
        console.log("hello world!!");
    }
}
obj.say()
interface Self {
    (a: number, b: number): number
}
interface P {
    name: string,
    age: number,
    say: Self
}
let obj: P = {
    name: 'snad',
    age: 12,
    say: (a, b) => a - b
}
console.log(obj.say(1, 2));

接口继承😸

extends

联合类型😸

interface AAAAAAAA{
    a: number
}

interface BBBBBBBB{
    b: number
}

//联合类型
type C = AAAAAAAA | BBBBBBBB

只读😸

readonly

4.字面量来定义类型😸

只能是定义时候的数据,典型用法为:与 | 结合起来使用:

let a='man'  | 'sex'   a只能是man或者sex中的一个值

5.type类型😸

| 和 & 结合起来使用的用法:

type rule = string | number
let a: rule
a = '121'
a = 121
export { }

&的用法:

interface Person {
    name: string
}
interface User extends Person {
    fans: number
}
interface Up extends Person {
    liuliang: number
}
type UpAndUser = User & Up
let obj: UpAndUser = {
    name: 'sha',
    fans: 10000,
    liuliang: 12121
}

6.unknown类型😸

我们在typescript尽量避免去使用any,因为使用any会跳过类型检查。例如:

let a: any
a = 1
a = "1212"
let b: boolean = true
b = a
console.log(a, b);

所以,针对这个问题,我们引出了unknown这个类型。

let a: unknown
a = 1
a = "1212"
let b: boolean = true
b = a//会报错,不会错过类型检查
console.log(a, b);

as😸

当我们肯定这个类型就是那个类型的时候,可以使用as,将那个类型当成as 类型来处理

let a: unknown;
a = 1
a = "1"
let b: string
//b = a//这样虽然都是字符串,但是会报错
b = a as string  //这样将a当成字符串来处理,不会报错

这样虽然不会报错,但是如果我们肯定的类型为错误的时候,我们也会错!显然,这种方法对人的要求很高

7.泛型😸

目的:定义函数/类的时候,遇到==参数不确定,==我们可以使用泛型。

function add<T>(a: T): T {
    return a
}
console.log(add(1));

8.面向对象😸😸😸💓

基本用法:

class Person {
    name: string
    age: number
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
}

如果在构造器外面用常量赋值,这个值是实例上可以使用的。💓💓

class Person {
    name: string
    age: number
    z: number = 100
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
    say(a: number, b: number): number {
        return a + b
    }
}
let YK = new Person('shuyikang', 100)
console.log(YK.say(1, 2));
console.dir(YK);


静态属性:💓💓💓

实例不能访问,通过类名去访问。

class Person {
    name: string
    age: number
    z: number = 100
    constructor(name: string, age: number) {
        this.name = name
        this.age = age
    }
    static say(a: number, b: number): number {
        return a + b
    }
}
let YK = new Person('shuyikang', 100)
console.log(Person.say(1, 2));
console.dir(YK);
export { }


抽象类 抽象方法💓💓💓

和java一样 目的是:重写里面的方法—作为一个检验机制。

abstract class Animal {
    name: string
    constructor(name: string) {
        this.name = name
    }
    abstract say(): void
}
class Dog extends Animal {
    say(): void {
        console.log('我在狗叫');
    }
}
class Pig extends Animal {
    say(): void {
        console.log('我在猪叫');
    }
}
let dog = new Dog('旺财')
let pig = new Pig('佩奇')
dog.say()
pig.say()
export { }

接口💓💓

定义一种规则,然后类通过implements来是实现这种规则。

interface Person {
    name: string,
    age: number
}
class P implements Person {
    name: string
    age: number
    constructor(name, age) {
        this.name = name
        this.age = age
    }
}

私有属性💓💓

除了本类,子类都不可以访问。类的实例对象也不能访问

interface Person {
    name: string,
    age: number
}
class P implements Person {
    name: string
    age: number
    private c: number = 1000
    constructor(name, age) {
        this.name = name
        this.age = age
    }
}
let p = new Person('jack', 100)
console.log(p.c);

报错!

可以手动去设置set和age方法。
这篇文章总结了一些ts日常使用的常见知识,如果想要了解ts的更多特性可以去往官网🧑🏼‍🚀🧑🏼‍🚀🧑🏼‍🚀ts中文官网

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值