typescript - 为什么我的 TypeScript 报告联合类型的错误?
问题描述
我有:
type: 'WEBSOCKET' | 'HTTP_STREAM';
connection: WebSocketType | HTTPStreamType;
在哪里:
interface Header {
key: string;
val: string;
}
export interface WebSocketType {
websocketUrl: string;
}
export interface HTTPStreamType {
streamUrl: string;
method: 'get' | 'put';
headers: Header[];
}
我正在努力:
if (newStream.type === 'WEBSOCKET') {
if (newStream?.connection?.websocketUrl?.length > 0) {
return setIsNextDisabled(false)
}
}
但我得到的错误是:
Property 'websocketUrl' does not exist on type 'WebSocketType | HTTPStreamType'.
Property 'websocketUrl' does not exist on type 'HTTPStreamType'.
我以为这guard
会起作用,但事实并非如此。
解决方案
我假设你有类似的东西:
interface MyData {
type: 'WEBSOCKET' | 'HTTP_STREAM';
connection: WebSocketType | HTTPStreamType;
}
根据这个界面,你可以拥有一个type
ofWEBSOCKET
和一个connection
of HTTPStreamType
。你在任何地方都没有保证每个工会的成员之间有任何联系。type
并且connection
都可以是工会的任何一个成员。
这就是为什么打字稿认为你的警卫没有帮助。
相反,您需要一种不同的联合:
type MyData = {
type: 'WEBSOCKET';
connection: WebSocketType;
} | {
type: 'HTTP_STREAM';
connection: HTTPStreamType;
}
这种类型表示它MyData
可能是一个WEBSOCKET
有WebSocketType
连接的类型,也HTTP_STREAM
可能是一个有连接的类型HTTPStreamType
。但它永远不能混合第一个属性和第二个属性。
现在打字稿可以推断出对其中一个属性的检查允许知道另一个属性类型。
带有通过类型检查的代码的游乐场。
通过一些重构,您可以避免重复像这样的常见属性。
interface MyCommonData {
foo: string
bar: number
}
interface WebSocketData extends MyCommonData {
type: 'WEBSOCKET'
connection: WebSocketType
}
interface HttpStreamData extends MyCommonData {
type: 'HTTP_STREAM';
connection: HTTPStreamType;
}
type MyData = WebSocketData | HttpStreamData
推荐阅读
- c++ - Clang 不会看到标题
- ios - Swift JSON响应两个字段值附加到单个数组中
- ios - 通过 Button 以编程方式将 UITableViewController 替换为 UIViewController 内的 tableView
- c - 带有字符串和整数的堆栈 - C
- python-3.x - TensorFlow 运行时错误——UnimplementedError
- android - 如何为我的 Espresso Activity 测试提供自定义应用程序类?
- css - 跨越多列的列表条目之间的行
- reactjs - ReactJS 通过 cdn 导入模块
- visual-c++ - 从 Modbus 静态库继承基类会导致返回时堆栈指针无效,但直接使用基类时工作正常
- ios - 为什么在视图控制器被取消初始化并导致 SIGABRT 或 EXC_BAD_ACCESS 后观察者仍然活着?