TypeScript 能手养成之旅 Day 12 泛用型别(Generics Types)

前言

今天要来介绍 泛用型别,在我们前面介绍的 型别化名 ,而 泛用型别 就是将 型别化名 参数化,接下来我们将型别带入 泛用型别,就会获的该型别的结果,究竟是如何使用呢? 让我们来继续看下去。

泛用型别使用方式

基本语法

我们使用 type 来将 tryIt 指定一个 泛用型别 并带一个参数为 T ,使用如下:

type tryIt<T> = {
  value: T;
};

let x:tryIt<String>
x = { value: 'cy'} // pass
x = { value: 11 } // 喷错

从这个范例我们可以得知,变数宣告 x 时,将 tryIt 泛用型别中的 T 参数带入 String ,当我们 value 的值带入数字,TypeScript 将会提醒我们错误。

结合 interface

interface tryValue<T> {
  value: T;
}

const oneTest = (x: tryValue<String>): String => {
  return x.value
}

console.log(oneTest({value: 'cy'})) // 'cy'

透过 extends,可以建立限制的泛用型别

interface tryValue<T extends number> {
  value: T
}

// 有给 tryValue 参数 10,且为 number, pass
const twoTest = (x: tryValue<10>): tryValue<10> => {
  return x
};

// 没给参数, 喷错
const twoTest = (x: tryValue): tryValue => {
  return x
};

// 参数为错误型别, 喷错
const twoTest = (x: tryValue<true>): tryValue<true> => {
  return x
};

经由 extends 我们可以更严格限制所要带入参数为何。

泛用型别也是可以 scope 的

function combo<T extends number[]>(cy: T) {
  return function lastCombo<K extends String>(will: K) {
    return [cy, will];
  };
}
const myCombo = combo([28])('omg');

结语

今天稍微介绍一下 泛用型别 常用的地方,还有很多结合使用的地方,大家可以一起探索更多使用方式。


<<:  Day-29 快速学习Excel时间函式

>>:  【Day 14】if 条件的范例讲解

Day11 Channel

通道Channel Channel可以想像成是一种资料结构,可以push data进去也可以pull...

# Day 12 Cache and TLB Flushing Under Linux (四)

Cache and TLB Flushing Under Linux 的最後一部份,一样文件! 文件...

事件—天外飞来一个e

刚开始学JavaScript的时候,在书上看到事件绑定的范例: //HTML <a id=&...

[Day09] 团队系统设计 - PO 系统

上篇文章中,我提出了一个「规画系统」,其系统的起始点,是由 PO 与 Designer 组成的子系统...