所以我有(和其他类型的负载)
export interface A {
links: number
name: string
}
export interface B {
cat: boolean
name: string
}
我想用
const IsTypeB = (obj: any): obj is B => {
if ((obj as B).cat) {
return true
}
return false
}
这将起作用,但是...(动机:我希望它具有可伸缩性,因为我打算为每个接口编写类型检查功能。使用上述方法,当我添加具有字段cat
的另一个接口时, ”需要向IsTypeWhatever函数添加其他检查,这将很快变得混乱。)
所以理想情况下,我想要类似的东西:
const IsTypeB = (obj: any): obj is B => {
if (obj is type B (sudo code)) {
return true
}
return false
}
我不必查询特定字段。这可能吗?
答案 0 :(得分:1)
如评论中所提到的,没有很好的内置功能可以做到这一点。有几种方法,但都不是很好。
正如您在问题中提到的,您可以手动编写所有内容。如果您没有太多的界面,我会这样做,但是很快就会变得不切实际。
一种方法是自动生成样板。这比您自己编写它要无聊,但是仍然存在很多问题(您是否检查样板?是否在某些构建步骤中包括了它?)
这可能需要一段时间才能编写自己,但是有npm库可以为您完成此操作。我没有用过,所以不会提出建议,但是我敢肯定您会找到一些建议。
您可以使用其他方式定义它们,而不是使用常规的打字机界面,以促进自动检查。还有许多图书馆可以这样做,尽管我不会再提出任何建议。
如果您的用例不太复杂,那么自己动手做也是可行的。
我整理了一个简单的示例,该示例将深入检查一个对象中的简单类型的级别。并非在每种情况下都行得通,因此,如果您决定自己采用这种方法,请确保将其设计为适合您关心的情况。
class Checker<T extends {}> {
constructor(public readonly example: T) {}
public check(other: {}): other is T {
const exampleKeys = new Set(Object.keys(this.example));
const otherKeys = new Set(Object.keys(other));
if (exampleKeys.size !== otherKeys.size) { return false; }
for (const key of exampleKeys) {
if (!otherKeys.has(key)) { return false; }
if (typeof (other as any)[key] !== typeof (this.example as any)[key]) { return false; }
}
return true;
}
}
const bChecker = new Checker({
cat: true,
name: "",
})
type B = typeof bChecker.example;
const something: {} = {
cat: false,
name: "Spot",
}
if (bChecker.check(something)) {
const b: B = something;
}
总体而言,没有完美的方法。但是,还有其他一些方法可以自己编写一堆样板。