我有下一个接口
interface ICustomImage {
data: string;
width: number;
height: number;
}
type UserImage = string | ICustomImage
interface IUser {
id: number;
firstName: string;
lastName: string;
image: UserImage
}
我从API获取IUser并将其存储在useState中,如下所示:
const [user, setUser] = useState<IUser[]>();
但是,当我尝试使用自动完成时,会发生这种情况,而不是显示字符串具有的所有方法或ICustomImage属性
user.image.width //Because I know it comes with width, this error appears
类型“string”上不存在属性“width|类型“string”上不存在属性“width”。
如何修复此问题,或使其可以使用以下内容
user.image.data or user.image.width or user.image.height
3条答案
按热度按时间o4tp2gmn1#
在访问
user.image
的属性之前,您必须缩小其类型。如果您不这样做,您将只被允许访问交叉/共享属性toString
和valueOf
。你可以这样做:
9avjhtql2#
Typescript正在抱怨,因为
user.image
可以是string
类型,因此你无法访问width
属性。你需要使用in
关键字检查TypeScript中的类型。因为你必须检查多个属性(高度、数据等),所以你可以定义一个type guard function。
如果你绝对确定它的类型是
ICustomImage
,那么你可以如下所示的转换该值:关于州名,它应该是复数(因为它是一个user数组)。
wn9m85ua3#
Typescript无法知道
image
是字符串还是接口对象。您还没有为解释器缩小范围,需要这样做。编写一个类型保护来处理此问题:你也可以做一个反向检查,你的类型保护程序检查对象是否是字符串,但这应该会给予你一些指导。