Type Hero 初级篇练习题(一)———泛型参数训练

450 阅读2分钟

Type Hero是一个非常优质的练习ts网站,通过学习并完成相关习题,可以提供我们对typescript 这门语言的理解和使用。

image.png

Generic Type Arguments 泛型类型参数

为什么我们需要泛型类型参数

image.png

泛型可以看做对TS中的变量(类型)进行操作的函数。就像函数需要参数一样,泛型类型也可以提供类型(变量)作为输入值,并在调用时确定真正类型。

如何使用泛型参数

对于泛型,我们使用尖括号<> 而不是括号()来传递变量

这里使用T 作为泛型类型参数

interface Row<T> {
  label: string;
  value: T;
  disabled: boolean;
}
// 调用泛型
type StringRow = Row<string>;

上面使用泛型定义的类型,完全等同于下面直接声明StringRow类型

// 直接声明StringRow类型
type StringRow = {
  label: string;
  value: string;
  disabled: boolean;
};

多个泛型参数

就像函数可以接收多个参数一样,泛型也可以。

type GroceryItem<Name, Price, InStock> = {
  name: Name;
  price: Price;
  inStock: InStock;
};

默认泛型参数

就像函数参数可以有默认参数一样,泛型也可以

type Log<Message, Level = 'info'> = {
  message: Message;
  level: Level;
};

type ImplicitInfo = Log<'implicit info'>; 

上面类型等同于下面

type ImplicitInfo = {
    message:'implicit info',
    level:'info'
}

例题

type Store = unknown;

type Item = unknown;

type Salad = unknown;

给定下面三个类型,利于上面学习泛型知识,使下面条件满足

type test_KrogerDetroit = Expect<Equal<
  Store<'Kroger', 'Detroit'>,
  { name: 'Kroger', city: 'Detroit' }
>>;

type test_StopNShopMassachusetts = Expect<Equal<
  Store<'Stop 'N Shop', 'Massachusetts'>,
  { name: 'Stop 'N Shop', city: 'Massachusetts' }
>>;


type test_CapreseSaladName = Expect<Equal<
  Salad['name'],
  'Caprese Salad'
>>;

type test_CapreseSaladPrice = Expect<Equal<
  Salad['price'],
  14.99
>>;

type test_CapreseSaladInStock = Expect<Equal<
  Salad['inStock'],
  true
>>;

例题解析:

  1. Store类型变量,想让 类型Store<'Kroger', 'Detroit'>等于类型{ name: 'Kroger', city: 'Detroit' },用泛型定义比较简单。
type Store<Name,City> ={
     name: Name,
     city:City
}
  1. 对于Salad类型,如果直接定义成索引类型是满足上面例子条件的,但这里需要使用泛型
type Salad ={
    name: 'Caprese Salad',
    price: 14.99,
    inStock: true
}

所以可以先声明一个泛型类型Item,然后在调用Item,声明salad就满足了

type Item<Name,Price,InStock> = {
     name:Name,
     price:Price,
     inStrock:InStock
}
// 调用Item泛型类型
type Salad = Item<'Caprese Salad',14.99,true>

总结

联系js知识,泛型其实就是对变量操作的函数,只不过这个变量在ts叫做类型而已,利于泛型在调用使用时,才确定类型的特性,我们可以更加灵活对类型进行定义,最后也欢迎大家发表自己见解~。

参考文献

Generic Type Arguments 泛型类型参数

为什么我总是学不好ts