TS中的类型选择:继承 vs Pick

169 阅读4分钟

原创首发于微信公众号:mp.weixin.qq.com/s/AB_5ZeNHT…


大家好,今天我们要分享的是:在 TypeScript 中,到底应该选择继承还是使用 Pick 工具类型来定义我们的类型?

那么,首先我们需要了解什么是 Pick 工具类型。不久前,我们在《再也不用担心类型定义冗余了!使用Pick工具类型优化TS开发体验!》一文中详细介绍了 Pick 的概念和使用方法,如果你还没看过,推荐你先阅读一下。

有小伙伴在阅读完之前那篇文章后提问:“这个使用 TypeScript 的继承不就可以了吗?”

网友评论

很不错的问题,借这个机会我们今天就来讨论一下。

首先,我们来了解一下什么是继承。

1. 什么是继承?

在 TypeScript 中,继承是面向对象编程的一种方式,允许我们创建一个新的类(子类),继承并扩展已有的类(父类)的属性和方法。在定义子类时,我们可以添加新的属性和方法,也可以覆盖父类的现有属性和方法。

    interface Person {
      name: string;
      age: number;
    }

    interface Employee extends Person {
      salary: number;
    }

在这个例子中,Employee 类型就继承了 Person 类型的所有属性,并添加了一个新的 salary 属性。

2. 继承和 Pick:有什么区别?

在某些情况下,我们可以通过继承或使用 Pick 来达到相似的效果。那么,这两种方式有什么本质的区别呢?

当我们使用继承时,我们是在创建一个新的类型,这个新的类型包含了父类型的所有属性,并且我们还可以在这个新的类型中添加更多的属性。也就是说,新类型是原类型的“超集”,适用于我们需要的新类型有更多的属性的情况。

然而,Pick 工具类型则是用于从原类型中选择一部分属性,创建一个新的类型。这个新的类型只包含我们在 Pick 中指定的那些属性,而不包含原类型的其他属性。也就是说,新类型是原类型的“子集”,适用于我们只需要原类型的部分属性的情况。

在之前的《再也不用担心类型定义冗余了!使用Pick工具类型优化TS开发体验!》中,我们详细解析了 Pick 工具类型类型,强烈推荐你阅读。

举个例子,假设你正在设计一个网页,你有一个描述用户的超大型对象,它包含了许多属性,如姓名、年龄、地址、职业等等。然而,在设计某个特定的组件时,你可能只需要用户的姓名和年龄。

如果你使用继承,那么你的新类型将会包含用户对象的所有属性,这显然是冗余的。而使用 Pick 工具类型,你可以很方便地从用户对象中提取出你需要的姓名和年龄属性,创建一个新的类型。这样做不仅避免了冗余,还提高了代码的可读性和可维护性。

3. 小结

在 TypeScript 中,继承和 Pick 工具类型都是我们在定义类型时的重要工具。它们各有其优点和适用场景:

  • 继承适用于我们需要新类型是原类型的“超集”(即新类型有更多的属性)的情况。
  • Pick 工具类型适用于我们需要新类型是原类型的“子集”(即新类型只需要原类型的部分属性)的情况。

在实际开发中,我们需要根据具体的需求和场景,灵活选择使用继承还是 Pick 工具类型。理解这两者的区别和适用场景,可以帮助我们更加熟练地操作 TS 中的类型系统,编写出更加灵活、可读性和可维护性更高的代码。

现在,我想你应该对它们之间的区别和应用场景有了初步的理解,你可以问一下自己,你的项目中是否有这两种场景的应用呢?

希望这篇简短的文章能帮助你更好地理解 TS 中的继承和 Pick 工具类型。如果你有任何问题或想法,欢迎在评论区留言讨论。

若有欠妥之处,欢迎斧正~ ❤