typescript数据类型(二)

devtools/2024/12/28 12:22:12/
四、高级数据类型
1. 接口(interface)

(1) 接口定义变量和函数参数的类型

//定义接口,给对象使用
interface InfoItf{name:string,age:number,height:string
}let obj:InfoItf = {name: 'Lucy',age: 14,height: '175'
}//定义接口,给数组使用
interface ArrItf {[idx:number]:number
}let arr:ArrItf = [1,3,4]
//定义接口:给函数使用
interface fnItf {(p:string,a:number):void
}
let fn:fnItf = (p:string,a:number)=>{}
fn('',1)

注意:

1. 很少使用接口类型来定义函数的类型,更多使用内联类型或类型别名配合箭头函数语法来定义函数类型;

(2) 接口继承
多个不同接口之间是可以实现继承的,但是如果继承的接口Person和被继承的接口NameItf有相同的属性,并且类型不兼容,那么就会报错。

interface NameItf{name:string,
}interface AgeItf{age: number
}
//接口继承
interface Person extends NameItf, AgeItf{height:number
}let info:Person = {name: 'Lucy',age: 16,height: 163
}

(3) 多个相同接口
多个相同名字的接口,会进行合并,得到一个新的接口;这个接口的特性一般用在扩展第三方库的接口类型。

interface Person {name: string,age: number
}interface Person {name: string,height: number
}let info:Person = {name: 'Lucy',age: 20,height: 175
}

(4) 缺省和只读特性

interface PersonInfo {name?: string; // 缺省readonly age: number; // 只读
}

2. 类型别名(type)

接口类型的一个作用是将内联类型抽离出来,从而实现类型可复用。其实,我们也可以使用类型别名接收抽离出来的内联类型实现复用。格式:type 别名名称 = 类型定义。

type Info = {name:string,age:number}let person:Info = {name:'Lucy',age: 14
}

看上面对type的基本使用,这跟interface使用方法不是重复了吗?其实不然,类型别名可以针对接口没法覆盖的场景,例如组合类型、交叉类型等;详情见另一篇笔记:Interface和Type的区别

3.函数类型

(1) 函数常规写法

//函数最初的写法
function fn(a:number,b:number):number{return a+b
}
//用interface定义接口的写法
interface FnType{(p:string):number
}
let fn:FnType = (p:string)=>{return 2
}
//调用函数
fn('')
//用type方式来定义接口
type FnType = {(p:string):void
}let fn:FnType = (p:string):void =>{}fn('')

(2) 函数传参

function fn(a:number,b:number){return 1
}fn(1,2);  //这个是函数的常规写法没有问题,不会报错

如果只调用函数的时候只传一个参数呢?如:fn(1);

默认传参形式1:

//默认参数,参数名b:number=2,b的默认参数就是2
function fn(a:number,b:number=2){return 1
}

默认传参形式2:

//默认参数,参数名b加上?号,代表参数可以缺省
function fn(a:number,b?:number){return 1
}

默认传参形式3:

//剩余参数
function fn(a:number,b:number,...arr:number[]){console.log(a,b,arr)
}
fn(1,2,3,4,5,6)   //很多个参数,用...剩余参数的形式

4.泛型

泛型指的是类型参数化,即将原来某种具体的类型进行参数化。设计泛型的目的在于有效约束类型成员之间的关系,比如函数参数和返回值、类或者接口成员和方法之间的关系。
我们用ts定义函数,写法如下,参数传递时内容会越来越多,如果把参数类型内容业抽离出来呢?

function fn(n:number|string):number|string{return n
}fn(100);
fn('1234')

比如我们就可以写成下面这样:

function fn<T>(n:T):T{return n
}fn<number>(100)
fn<string>('123')

泛型类型

//定义数组类型
let arr:Array<number> = [1,3,4]
let arr1:Array<string> = ['1','2']//类型别名
type typeFn<P> = (params:P) =>P;
let fnType:typeFn<number> = (n:number) =>{return n
}let fn1:typeFn<string> = (p: string):string => {return p;
} 
// 定义接口类型
interface TypeItf<P> {name: P;getName: (p: P) => P;
}let t1: TypeItf<number> = {name: 123,getName: (n: number) => {return n;},
};let t2: TypeItf<string> = {name: "123",getName: (n: string) => {return n;},
};

泛型约束
把泛型入参限定在一个相对更明确的集合内,以便对入参进行约束。

interface TypeItf<P extends string | number> {name: P;getName: (p: P) => P;
}let t1: TypeItf<number> = {name: 123,getName: (n: number) => {return n;},
};let t2: TypeItf<string> = {name: "123",getName: (n: string) => {return n;},
};

http://www.ppmy.cn/devtools/145754.html

相关文章

Redis 应用场景深度探索

一、Redis 简介 Redis&#xff08;Remote Dictionary Server&#xff09;是一款高性能的开源内存数据库&#xff0c;同时也可用作缓存系统。它以其卓越的性能和丰富的数据结构而备受瞩目&#xff0c;具有以下关键特性&#xff1a; 基于内存存储&#xff1a;数据读写操作主要在…

Redis篇--常见问题篇9--其他一些问题

之前的篇章中介绍了Redis使用中的一些问题&#xff0c;如&#xff1a;缓存穿透&#xff0c;缓存雪崩&#xff0c;缓存击穿&#xff0c;缓存一致性&#xff0c;大Key以及热Key&#xff0c;这些问题算是比较常遇到的问题了。除此之外&#xff0c;还有一些其他的问题&#xff0c;如…

<代码随想录> 算法训练营-2024.12.26

今日专题 &#xff1a;动态规划 子序列 1143. 最长公共子序列 描述&#xff1a; 给定两个字符串 text1 和 text2&#xff0c;返回这两个字符串的最长 公共子序列 的长度。如果不存在 公共子序列 &#xff0c;返回 0 。一个字符串的 子序列 是指这样一个新的字符串&#xff1…

(同一个正则表达式设置了全局标志(如 g),并循环使用test方法),导致匹配相同值却返回结果不一样

(同一个正则表达式设置了全局标志&#xff08;如 g&#xff09;,并循环使用test方法)&#xff0c;导致匹配相同值却返回结果不一样&#xff01; 正则表达式的 lastIndex 属性。每次执行 test 方法时&#xff0c;如果正则表达式设置了全局标志&#xff0c;test 方法会改变正则表…

Android 13 非 Launcher 应用开机启动:通过监听开机广播实现

Android 13 非 Launcher 应用开机启动:通过监听开机广播实现 在 Android 系统中,非 Launcher 应用无法直接作为默认启动器运行,尤其是在 Android 13 中,即使通过修改 AOSP 源码为应用添加 Launcher 属性,也可能无法实现开机启动。针对这种情况,如果项目时间紧迫,可以通…

当鼠标右键点击的时候,下拉菜单显示一片空白,该怎么解决?

问题展示&#xff1a; 当鼠标右键点击空白处&#xff0c;或者鼠标右键点击文件的时候&#xff0c;下拉框显示一片空白。。。 解决办法&#xff1a; 鼠标右键 电脑桌面底部&#xff0c;打开 任务管理器&#xff1b; 在进程中&#xff0c;找到Windows资源管理器&#xff0c;然后…

面试题整理17----K8s中request和limit资源限制是如何实现的

面试题整理17----K8s中request和limit资源限制是如何实现的 1. 资源请求&#xff08;Resource Requests&#xff09;2. 资源限制&#xff08;Resource Limits&#xff09;3. 总结 在Kubernetes&#xff08;K8s&#xff09;中&#xff0c;Pod的资源限制&#xff08;Resource Lim…

基于Spring Boot的个性化推荐外卖点餐系统

一、系统概述 该系统旨在为用户提供便捷、个性化的外卖点餐体验&#xff0c;同时为商家提供高效、智能的餐饮管理服务。通过利用Spring Boot框架的稳定性和可扩展性&#xff0c;系统实现了前后端分离的开发模式&#xff0c;支持多种设备和平台&#xff0c;确保用户在不同场景下…