【发布时间】:2019-09-10 11:57:07
【问题描述】:
有没有最好的方法来检查一个对象与打字稿接口?
我在两个模式之间工作,其中一个扩展了另一个。我需要将扩展转换回基类,并通过从扩展中删除道具以将其塑造为原始基类来实现。一个例子:
interface Base {
prop1: string
prop2?: string
prop3?: string
}
interface Extended extends Base {
prop4: string
prop5: string
}
所以为了让Extended回到Base,我需要delete props prop4和prop5
这当然很容易做到,但是,我需要确保最终结果符合Base 类,因为deleting props does not tell the compiler anything,并且扩展将通过Base 类型检查。
我已经研究过使用类型保护和other alternatives,但是,我还没有找到一种方法来适应Base 中的可选属性,或者一种看似有效的方法。
这是类型保护的基本计划以及处理可选道具:
function isBase(arg: any): arg is Base {
return arg
&& arg.prop1
&& (arg.prop2 || true)
&& (arg.prop3 || true)
}
除了要为很多道具做大量工作之外,它还很脆弱。 Base 更改后,此技术将不再按预期工作。我觉得(应该)有一些通过实用程序类型的 Typescript 方式可以根据Base 接口检查道具,所以它总是会按预期工作。
更新
我找到了this。看起来非常接近,但无法让它与接口一起使用。
【问题讨论】:
-
实用程序类型不起作用,因为接口是设计时类型而不是运行时类型,因此您需要首先编译类型保护代码,然后才能运行。类型保护是 AFAIK 的唯一解决方案。
-
"我需要将扩展转换回基础" 为什么?如果该类型扩展了一个基类,那么该类型可以被视为一个基类,您不需要删除属性...
-
扩展名用于客户端目的,基础是存储在数据库中的内容。因此,虽然它可以被视为基础,但我不想存储扩展保存的额外数据(在数据库中),并且想在通过网络发送之前检查是否是这种情况。
标签: typescript