TS的泛型

泛型(Generices)

定义:

  • 定义函数,接口或者类时,不预先指定具体类型,而是在使用的时候指定具体类型

使用:

  • 在函数名称后面加一对尖括号,尖括号里面泛型名称(习惯写法为T,可以是任意名字)

  • 泛型名称可以看成是一个变量(也可以看作是一个占位符)

  • 泛型可以是任意类型在使用时指定即可

// 函数名后面插入尖括号,写入泛型名称T,参数和返回类型都是T
function echo<type>(arg:type):type {
    return arg
}
const str: string = '字符串'
// result 是 string 类型
const result = echo(str)
// 也可以不指定类型, ts 可以自动推断出类型
const result = echo(123) // 此时 result 为 number 类型

现在有个元组,里面有两个不同类型的值, 把这个元组传入 swap 方法中, 交换两个值的位置, 返回交换位置后的元组

// 定义元组
const tuple:[number,string] = [123,'str']

// swap 方法实现
function swap<T,U>(tuple:[T,U]):[U,T] {
    return [tuple[1],tuple[0]]
}

// 调用
const result = swap(tuple)

result[0]. 可以调用 字符串 的方法
result[1]. 可以调用 number 的方法

约束泛型

  • 使用 extends 使传入值满足约束条件
// 首先定义一个 IWithLength 的 interface
interface IWithLength {
    length: number
}
// 在 泛型名称T后面 使用 extends 关键字继承定义的 IWithLength 接口
function echoWithLength<T extends IWithLength>(arg:T):T {
    console.log(arg.length)
    return arg
}
// 验证下
const str = echoWithLength(`str`)
const obj = echoWithLength({a:1,b:'str'})
const arr = echoWithLength([1,2,3])

使用泛型描述类

// 类名称后面传入泛型
class Queue <T>{
    private data:T[] = [];
    push(item:T) {
        return this.data.push(item)
    } 
    pop():T {
        this.data.shift()
    }
}
// 实例化 的时候传入想要的类型
const queue1 = new Queue<number>()
queue1.push(1)
console.log(queue1.pop().toFixed()) // 这里返回类型就是number可以使用 number 方法

// 实例化 的时候传入想要的类型
const queue2 = new Queue<string>()
queue1.push(`str`)
console.log(queue2.pop().length) // 这时可以调用 string 的方法

使用泛型描述对象

// 定义类型的时候 动态指定值 
interface KeyPair<T,U> {
    key: T;
    value: U;
}

let kp1: KeyPair<number,string> = { key: 123, value: 'str' }
let kp2: keypair<string,number> = { key: 'str', value: 123 }

使用泛型描述数组

// 方法一
let arr2: Array<number> = [1,2,3]

// 方法二
interface Info {
    age: number
    name: string
}
let arr1: Info[] = [
    {age: 18, name: 'lili'},
    {age: 10, name: 'hihi'},
]

使用泛型描述函数

// 定义一个泛型接口
interface IPlus<T> {
    (a:T,b:T) : T
}
// 变量绑定类型
const plus: Iplus<number> = function (a,b){
    return a + b;
}
// number 类型
const a:Iplus<number> = plus(1,2)
// string 类型
const b:IPlus<string> = plus('hello','wold')
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容

  • 拿下泛型,TS 还有什么难的吗? 大家好,我是沐华,本文将剖析 TS 开发中常见工具类型的源码实现及使用方式,并且...
    IT沐华阅读 210评论 0 0
  • 设计泛型的关键动机是在成员之间提供有意义的类型约束,这些成员可以是类的实例成员、类的方法、函数的参数、函数的返回值...
    涛_3ac8阅读 638评论 0 0
  • TS中的泛型 typescript 中 最难的无疑是泛型(Generices), 那么泛型出现的动机是什么呢? 思...
    瀡風阅读 417评论 0 0
  • 泛型 泛型是一种参数化数据类型,具有以下特点1:定义时不明确,使用时必须明确成 某种具体数据类型 的数据类型【泛型...
    wyc0859阅读 2,428评论 0 5
  • issue 如何关联本地分支和远程分支 git branch --set-upstream-to=origin/r...
    woow_wu7阅读 3,319评论 0 1