gpt4 book ai didi

typescript 多类型参数

转载 作者:行者123 更新时间:2023-12-02 09:24:25 25 4
gpt4 key购买 nike

我不知道如何访问 pos 属性。

error TS2339: Property 'pos' does not exist on type '{ pos: RoomPosition; } | RoomPosition'.

public moveTo(target: RoomPosition | { pos: RoomPosition }, opts?: FindPathOpts): number {
..
if (target instanceof RoomPosition && !target.isEqualTo(destination.x, destination.y)) {
..
} else if (!target.pos.isEqualTo(destination.x, destination.y)) {
..
}

最佳答案

参见 https://www.typescriptlang.org/docs/handbook/advanced-types.html

当您使用联合类型时,您只能访问两种类型共有的属性 - 因为它们是 Typescript 唯一知道的肯定会在变量上的属性。

要访问仅在给定类型上可用的变量,您需要使用类型断言。您可以使用显式类型断言,例如

if (target instanceof RoomPosition && !target.isEqualTo(destination.x, destination.y)) {
...
} else if (<{pos:RoomPosition}>target.pos.isEqualTo(destination.x, destination.y)) {
...
}

您还应该稍微重组您的代码,因为即使 target 是 RoomPosition,但它不等于目的地,也可能会触发 else 条件,这可能会导致访问 else 子句中的 .pos 时出现运行时问题。以下是更安全的:

if (target instanceof RoomPosition) {
if (!target.isEqualTo(destination.x, destination.y)) {
...
}
} else if (<{pos:RoomPosition}>target.pos.isEqualTo(destination.x, destination.y)) {
...
}

可能还值得定义一个命名类型或接口(interface)来表示 {pos:RoomPosition}

还有其他语法方法可以实现相同的目的 - 请参阅上面的文档以了解用户定义的类型保护和一些其他使用联合类型的机制。

关于 typescript 多类型参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39065077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com