TypeScript高級技巧: 提取對象類型

如今不管是前端,仍是基於Node.js的後端,對TypeScript的使用愈來愈多。今天咱們說一個TypeScript高級使用技巧——提取已有對象的類型。javascript


在ts中,一般咱們是先聲明類型,再建立該類型的對象:前端

type User = {
  name: string,
  age: number
}

const me: User = { name: 'Youmoo', age: 18 };

在某些狀況下咱們並不知道一個對象的類型,(如引用三方庫的對象,而三方庫並無暴露該對象的類型時)java

咱們能夠藉助ts,讓它幫咱們推斷出對象類型:後端

const animal = { type: 'cat', name: 'Tom' };

// 對於以上對象,咱們須要提取出它的類型,並建立一個同類型的對象
type Animal = typeof animal;

// 定義一個同類型的對象
const mouse: Animal = { type: 'mouse', name: 'Jerry' };

在visual studio code中,能夠看到ts幫咱們正確地推導出了Animal類型:數組

以上是簡單的object對象,若咱們想提取數組內元素的類型呢?微信

方法有多種。spa

1、利用下標提取元素類型3d

type Animals = Array<{ type: string, name: string }>;
type Animal = Animals[number];

2、利用conditional+infercode

type Animals = Array<{ type: string, name: string }>;
type Animal = Animals extends (infer T)[] ? T : never;

有了以上技巧,能夠引出一些有意思的玩法。對象

好比,將string數組中的元素提取爲常量類型

const valid_answers = ['yes', 'no', 'answer'] as const;
type Answer = (typeof valid_answers)[number];
const ans1: Answer = 'yes';// 沒問題
const ans2: Answer = 'nope';// 編譯不經過

其中Answer的類型定義是:

咱們甚至能夠繼續向內,提取更深層的字段類型

type Foo = { x: Array<{ y: string }> };
type TypeY = Foo['x'][number]['y'];

你說,TypeY是什麼類型呢?


本文初發佈於微信公衆號 背井(nineteen84)。掃碼可關注。

相關文章
相關標籤/搜索