我正在创建一个处理数据库中的对象的函数。我有两种不同的数据结构,其中相同的属性具有不同的名称。我无法改变这一点,所以我必须用 JavaScript 来处理它。
这些对象还有其他差异,但这对此功能并不重要。
我想对两种不同类型的对象使用相同的函数。这是演示我的问题的示例代码:
interface TypeA {
itemName: string;
}
interface TypeB {
itemTitle: string;
}
function getItemName(item: TypeA | TypeB): string {
let name = '';
if (item.hasOwnProperty('itemName')) {
name = item.itemName;
} else {
name = item.itemTitle;
}
return name;
}
当然,这段代码可以运行。但 IDE 标记了这两行name = item.itemName;
and name = item.itemTitle;
作为错误(“类型上不存在属性”),因为两种类型都不具有这两种属性。
那么,执行此操作的正确打字方式是什么?
您需要创建一个用户定义的类型防护,然后您可以使用 if 语句并获得正确的类型。
function isTypeA(value: TypeA | TypeB): value is TypeA {
return value.hasOwnProperty('itemName');
}
然后你可以让打字变得更干净:
function getItemName(item: TypeA | TypeB): string {
return isTypeA(item) ? item.itemName : item.itemTitle;
}
一探究竟here https://www.typescriptlang.org/play/index.html#src=interface%20TypeA%20%7B%0D%0A%20%20%20%20itemName%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Ainterface%20TypeB%20%7B%0D%0A%20%20%20%20itemTitle%3A%20string%3B%0D%0A%7D%0D%0A%0D%0Afunction%20getItemName(item%3A%20TypeA%20%7C%20TypeB)%3A%20string%20%7B%0D%0A%20%20%20%20return%20isTypeA(item)%20%3F%20item.itemName%20%3A%20item.itemTitle%3B%0D%0A%7D%0D%0A%0D%0A%20%20%20%20function%20isTypeA(value%3A%20TypeA%20%7C%20TypeB)%3A%20value%20is%20TypeA%20%7B%0D%0A%20%20%20%20%20%20%20%20return%20value.hasOwnProperty('itemName')%3B%0D%0A%7D%0D%0A%0D%0A。项目已正确转换为 TypeA 和 TypeB。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)