在 typescript 中函数体中判定参数类型的妙招
文中提出了一种需求,需要在一个 typescript 函数中判定参数的类型。在该示例中,函数处理两种类型的参数,分别对应 person 和 animal 接口。目标是在函数体中识别参数的具体类型,并依据不同类型进行后续处理。
类型判定
1. 手动编写谓词函数
可以使用 JavaScript 的 in 运算符来检查对象的属性是否存在。通过这种方式,可以编写手动谓词函数来判断对象是否属于特定类型。例如:
function isperson(o: unknown): o is person { ... // 检查属性是否存在和类型的逻辑 } function isanimal(o: unknown): o is animal { ... // 检查属性是否存在和类型的逻辑 }
2. 使用第三方工具库 io-ts
io-ts 是一个流行的 typescript 运行时类型检查工具库。它提供了一系列便捷函数来创建类型类型判定工具。例如:
import * as t from 'io-ts' const user = t.type({ name: t.string, age: t.number }) const animal = t.type({ food: t.string, kind: t.string }) function test(some: user | animal) { if (user.is(some)) { ... // some 的类型已收窄为 user } if (animal.is(some)) { ... // some 的类型已收窄为 animal } }
3. 使用 class 实例并结合 instanceof
typescript 的 class 既是类型又是值。因此,可以创建 class 实例并使用 instanceof 运算符来检查对象的原型链,从而判断其类型。例如:
class Person { ... // 属性和构造函数逻辑 } class Animal { ... // 属性和构造函数逻辑 } function test(some: Person | Animal) { if (some instanceof Person) { ... // some 的类型已收窄为 Person } if (some instanceof Animal) { ... // some 的类型已收窄为 Animal } }
总结
以上方法展示了在 typescript 函数体中判定参数类型的三种常见技术。根据具体需求,开发者可以选择最适合自己的实现方式。