typescript高级

typeof获取类型:

class T1 {
    num?: number
}
const a: T1 = { num: 1 }
const aa = { count: 1 }
console.log(typeof a) // 获取a的类型
function logNumber(number: typeof aa) { // 获取aa的类型当作number的类型
    console.log(number.count)
}
logNumber(aa)

typeof只能查询变量或对象属性的类型,不能查询函数调用后的类型

class类成员的可见性修饰符:

public: 公开的,没有访问限制

protected:受保护的,只有本类和子类可访问

private:私有的,只有本类自己能访问

class类成员的只读修饰符(接口和对象的属性也能用readonly修饰):

在属性上加上readonly除了初始化赋值,不允许再赋值修改

类型兼容(类,接口,函数都遵循类型多的可以兼容少的,但是当函数参数为复杂类型时(比如对象)就反之):

交叉类型(&):

将多个类型合并为一个类型,同时拥有他们的所有类型,类似继承extends的功能

// 在ProgressEvent上合并一个对象类型,使其扩展一个percent属性的类型
type Result = progress: ProgressEvent & { percent: number }

当使用继承时有类型冲突导致报错,可以使用交叉类型来兼容:

keyof:遍历一个对象的所有key然后生成一个联合类型

泛型函数:

// 泛型函数
function id<Type>(value: Type): Type {
    return value
}
console.log(id<number>(1))
console.log(id(1))// 可以不传类型,因为ts可以根据传入参数的类型推断Type 如果不传类型得到的结果类型会显示是字面量类型
console.log(id<string>('字符串'))
console.log(id<boolean>(true))
console.log(id<string[]>(['字符串1', '字符串2']))

对泛型函数添加约束,缩小泛型类型取值范围:

interface ILength {
    length: number
}
// 给泛型添加约束,必须满足ILength接口,对象要有一个length属性
// 这里的extends不是继承的意思,是左边的泛型Type要满足右边的泛型约束的意思
function id<Type extends ILength>(value: Type): Type {
    return value
}
console.log(id('1'))
console.log(id([1]))
console.log(id({ length: 1 }))
// 错误 没有length属性不满足ILength
console.log(id(1)) // 报错

对泛型函数多个参数进行约束:

// 写一个函数根据对象的key获取对象的属性值
// 这里的keyof就是获取Type对象的所有key组成联合类型,然后Key要满足联合类型其中的一个,也就是 name | age
function getProp<Type, Key extends keyof Type>(obj: Type, key: Key): unknown {
    return obj[key];
}
const user = { name: 'Suk', age: 18 }
// 这里的key参数就受user对象的所有key约束,必须是其中的一个 否则报错
const res = getProp(user, 'name')
console.log(res)

泛型接口:

// 定义一个泛型接口约束对象
interface IdFunc<Type> {
    value: Type;
    id: (value: Type) => Type;
    ids: (values: Type[]) => Type[]
}
const idFun: IdFunc<number> = {
    value: 1,
    id: (value) => value,
    ids: (values) => values
}

泛型类:

class GenericNum<NumType extends number> {
    public defaultValue: NumType | undefined;
    constructor(num?: NumType) {
        this.defaultValue = num;
    }
    public add(num1: NumType, num2: NumType): number {
        return num1 + num2
    }
}
// 泛型类在使用时如果有构造函数,泛型尖括号里的类型变量是可以省略不写的 他会根据构造的形参推断类型  但是接口必须要写不能省略
const g1 = new GenericNum();
const g2 = new GenericNum<number>();
console.log(g1.add(1, 2));

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值