ts泛型和补充类型基础

目录

implements字句

泛型基本使用

泛型约束

泛型接口

泛型类

补充类型

unknown类型

map对象

条件类型

映射类型


implements字句

类可以实现接口,使用笑键字implements

可以使用一个implements子句来检查一个类,是否满足了一个特定的接口。如果一个类不能正确地实现它,就会发出一个错误

注意点:

实现一个带有可选属性的接口并不能创建该属性

只要一个接口继承了某个类.那么就会继承这个类中所有的属性和方法,但是只会继承属性和方法的声明,不会继承属性和方法实现

与extends的区别

extends:继承某个类,继承之后可以使用父类的方法,也可以重写父类的方法

implements:继承某个类,必须重写才可以使用

interface IPerson{
    name:string
    age:number
    sex?:string
    show():void
}
interface Imusic{
    music:string
}
class Person implements IPerson,Imusic{
    name: string='许嵩'
    age:number=20
    sex:string='男'
    music:string='庐州月'
    show(){
        console.log(`我是${this.name},今年${this.age}岁了,我唱过${this.music}`);
    }
}
let a = new Person()
a.show()

interface Ipon extends Person{
    aaa:string
}
class IPon extends Person implements IPon{
    aaa: string='周杰伦'
}
let b = new IPon()
console.log(b.aaa);

泛型基本使用

泛型可以理解为宽泛的类型,通常用于类和函数。使用的时候我们再指定类型

泛型不仅可以让我们的代码变得更加健壮,还能让我们的代码在变得健壮的同时保持灵活性和可重用性

通过用<T>来表示,放在参数的前面

let getArray = <T>(value:T,items:number):T[]=>{
    return new Array(items).fill(value)
}
let a = getArray<string>('周杰伦',10)
console.log(a);

泛型约束

在TS中,我们需要严格的设置各种类型,我们使用泛型之后,将会变得更加灵活,但同时也将会存在一些问题我们需要对泛型进行约束来解决这些问题

interface Iaa{
    length:number
}
function aa<T extends Iaa>(arr:T):number{
    return arr.length
}
aa('大家撒')
aa([1,2,5,8,9,6,3])

let p = aa(['请求','王五'])
console.log(p);

泛型接口

将泛型与接口结合起来使用,可以大大简化我们的代码,增加我们的代码可读性。

泛型也可以使用默认值

interface IPerson<T1=string,T2=number>{
        name:T1
        age:T2
    }
    let p:IPerson={
        name:'王五',
        age:20
    }
    console.log(p);

泛型类

泛型类看上去与泛型接口差不多。泛型类使用()括起泛型类型,跟在类名后面。

class Person<T1,T2>{
    name:T1
    age:T2
    sex:T1
    constructor(name:T1,age:T2,sex:T1){
        this.name = name
        this.age = age
        this.sex = sex
    }
}

let p = new Person('周杰伦',20,'男')
console.log(p);
let p1 = new Person<string,number>('许嵩',20,'男')
console.log(p1);
let p2:Person<string,number> = new Person('林俊杰',20,'男')
console.log(p2);

补充类型

unknown类型

unknown类型代表任何值。这与any类型类似,但更安全,因为对未知unknown值做任何事情都是不合法的。unknown类型被称作安全的any

任何类型都可以赋值给unknown类型

let str:unknown
str = 18
str = '王五'
str = true

不能将unknown类型赋值给其他类型

let val:unknown = 18;
let num:number;
// num=val;  //报错

适用类型断言

num  = val as number

使用类型缩小

if(typeof val == 'number'){
    num == val
}

unknown与其他任何类型组成的交叉类型最后都是其他类型

type MyType = number & unknown
type MyType2 = unknown & boolean
let a:MyType = 18
let b:MyType2 = true

unknown除了与any以外,与其他任何类型组成的联合类型最后都是unknown类型

type MyType3 = unknown | any
type MyType4 = unknown | number
type MyType5 = unknown | string | boolean

never类型是unknown类型的子类型

type MyType6 = never extends unknown ? true:false

map对象

Map对象保存键值对,并且能够记住键的原始插入顺序。

任何值(对象或者原始值)都可以作为一个键或一个值。

Map 是ES6中引入的一种新的数据结构

可以使用for of进行迭代

Map相关的函数与属性:

map.clear()-移除Map对象的所有键/值对。

map.set()-设置键值对,返回该Map对象。

map.get()-返回键对应的值,如果不存在,则返回undefined。

map.has()-返回一个布尔值,用于判断Map中是否包含键对应的值。

map.delete()–删除Map中的元素,删除成功返回true,失败返回false。

map.size -返回Map对象键/值对的数量。

map.keys()-返回一个lterator对象,包含了Map对象中每个元素的键。

map.values()-返回一个新的Ilterator对象,包含了Map对象中每个元素的值。

// 创建map对象
let aa = new Map();
// 设置map对象
aa.set("周杰伦",1)
aa.set("许嵩",1)
aa.set("林俊杰",1)
// 获取map对象的值
console.log(aa.get('许嵩'));
// 清空map对象
// aa.clear()
// console.log(aa);
// 判断map对象中是否包含键对应的值 返回true或false
console.log(aa.has('许嵩'));
// 删除map对象中的元素 返回true或false
console.log(aa.delete('许嵩'));
// 返回map对象键/值的数量
console.log(aa.size);
// 循环map对象中的键
for(let a of aa.keys()){
    console.log(a);
}
// 循环map对象中的值
for(let a of aa.values()){
    console.log(a);
}
// 对象解析
for(let [a,b] of aa){
    console.log(a,b);
}

条件类型

条件类型的形式看起来有点像JavaScript中的条件表达式

T extends U ? TrueType : FalseType

应用场景:解决函数重载问题

条件类型

interface Ia{
    name:string
}
interface Ib{
    age:number
}
type c<T>=T extends string?string:any
type res = c<string>

应用场景 解决函数重载问题

type Cond<T> = T extends string?Ia:Ib
function reLoad<T extends number|string>(idOr:T):Cond<T>{
    throw ""
}
let res1 = reLoad('王世鑫')
let res2 = reLoad(20)

映射类型

Record 映射类型

它会将一个类型的所有属性值都映射到另一个类型上并创造ige新的类型

type Name ="person"|"animal"
type Person={
 name:string
 age:number
}
type NewType=Record<Name,Person>
let res :NewType ={
    person:{
    name:"克兰",
    age:18
    },
    animal:{
    name:"小小",
    age:3
    }
   }

console.log(res);
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
TS(TypeScript)是一种静态类型检查的高级编程语言,它是JavaScript的超集。在TS中,基础类型泛型都是其重要的概念。 基础类型指的是TS中预定义的简单数据类型,例如:number、string、boolean、null、undefined等。基础类型用于表示变量或函数的数据类型,可以直接赋值给变量,也可以用作函数的参数和返回值类型基础类型的定义和使用非常简单,只需要在变量或函数的类型声明中指定即可。 泛型(Generic)是一种在编程中广泛使用的概念,它允许我们在定义函数、类或接口时使用可变的类型。使用泛型可以提高代码的复用性和灵活性。在TS中,使用<>符号来声明使用泛型,并通过类型参数来指定具体的类型。 例如,定义一个泛型函数: function identity<T>(arg: T): T { return arg; } 这个函数使用了泛型类型参数T,可以接受不同类型的实参,并返回相同类型的值。通过使用泛型,我们可以传入任意类型的参数,而不需要重写多个函数。 另外,在TS中还可以使用泛型约束来限制泛型类型的操作。通过在泛型类型参数后面添加extends关键字和约束类型,可以确保传入的类型必须满足特定条件。 总结起来,TS中的基础类型泛型都是为了增强代码的可读性、可维护性和可靠性而设计的。基础类型用于定义简单的数据类型,而泛型则用于创建更灵活和可复用的函数、类和接口。在实际开发中,合理使用基础类型泛型,可以提高代码的质量和开发效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值