我一直在尝试创建一种方法来检查从数据库提供的值是否满足作为枚举的一部分。我首先想提供一个泛型TypeGuard,然后我决定提供一个函数不仅可以根据枚举检查值,还可以提供一些处理这两种情况的方法。然而,TypeScript显然不允许您在泛型声明中提供,所以我决定检查一个像这样的对象,这会更抽象,我会说这是一个受欢迎的功能。
typeGuard<E extends Object>(value: string): value is E {
return Object.values(E).includes(value);
}
那么可以理解它不起作用,因为我不能直接将E传递给Object.values(),因为它不是一个对象,而只是一个类型。一种方法是将对象作为另一个参数传递,然而,这对我来说有点笨重,因为我不会以任何其他方式使用对象。同样的问题仍然存在,因为我只想将它用作函数,而不是类型保护。
typeGuard<E extends Object>(values: string): boolean {
return Object.keys(E).includes()
}
有没有一种方法可以通过检查对象的TYPE而不是对象本身来检查给定的值是否是对象中表示的值?
1条答案
按热度按时间rdlzhqv91#
好吧,不,因为类型脚本编译器不向运行时传递类型信息。
有一些方法可以将静态类型传递到运行时(使用转换器),但我怀疑这是否适用于将类型传递到泛型 call
检查对象是否正确匹配任何(深度)类型的推荐方法是使用Zod或更新的https://arktype.io/。
ArkType有更简单的样板文件,可以很容易地从验证器定义中推断出TS类型定义,所以我建议检查一下