这是我遇到过几次的情况,看起来应该很简单,但是我找不到一个没有将类型设置为任何类型的解决方案
函数将两个不同对象之一作为参数,检查已接收到哪个对象,并返回相应的字段。
这是问题的简化版本,但是问题在于这两个对象只能通过它们的属性(没有重叠)来区分,并且我无法访问任何属性,因为它们不存在在另一种类型上。
type Obj1 = {
message: string
}
type Obj2 = {
text: string
}
const getText = (obj: Obj1 |obj2): string => {
if (obj.message) {
return obj.message
}
return obj.text
}
答案 0 :(得分:3)
您必须缩小类型。您可以使用in
运算符来实现。
const getText = (obj: Obj1 | Obj2): string => {
if ("message" in obj) {
return obj.message
}
return obj.text
}
答案 1 :(得分:1)
您可以将对象投射到Obj1
或Obj2
:
type Obj1 = {
message: string
}
type Obj2 = {
text: string
}
const getText = (obj: Obj1 | Obj2): string => {
if ((obj as Obj1).message) {
return (obj as Obj1).message
}
return (obj as Obj2).text
}
答案 2 :(得分:0)
根据问题所有者提出的问题,此问题的真正答案是this
但有时您可能会以这种方式将 your defined type
与 primitive type
一起使用,上述解决方案不会像我遇到的问题那样奏效
这是情况
type Obj1 = {
message: string
}
const getText = (obj: Obj1 |string): string => {
if (obj.message) {
return obj.message
}
return obj.text
}
所以在这种情况下,上述解决方案对您来说并不完美,因此您可能需要使用 typeof
✌️
const getText = (obj: Obj1 | string): string => {
if (typeof obj !== 'string') {
return obj.message
}
return obj.text
}
答案 3 :(得分:-1)
我推荐typescript-is。
import { is } from 'typescript-is';
...
const getText = (obj: Obj1 | Obj2): string => {
if (is<Obj1>(obj)) {
return obj1.message;
}
return obj2.text;
};