如何实现含可选类型成员的QueryInfo接口并正确传参?
解决QueryInfo接口实现的类型不匹配问题
原接口与函数定义
QueryInfo接口代码
type [<AllowNullLiteral>] QueryInfo = abstract status: QueryInfoStatus option with get, set abstract lastFocusedWindow: bool option with get, set abstract windowId: float option with get, set abstract windowType: QueryInfoWindowType option with get, set abstract active: bool option with get, set abstract index: float option with get, set abstract title: string option with get, set abstract url: U2<string, ResizeArray<string>> option with get, set abstract currentWindow: bool option with get, set abstract highlighted: bool option with get, set abstract discarded: bool option with get, set abstract autoDiscardable: bool option with get, set abstract pinned: bool option with get, set abstract audible: bool option with get, set abstract muted: bool option with get, set abstract groupId: float option with get, set
query函数定义
abstract query: queryInfo: QueryInfo -> unit
错误实现及报错信息
用户尝试传递active=true、currentWindow=true的代码:
type Query(active:bool option,currentWindow:bool option) = interface Chrome.Tabs.QueryInfo with member _.active = active member _.currentWindow = currentWindow query(Query(true,true))
IDE提示错误:
This expression was expected to have type 'bool option' but here has type 'bool'
错误原因
QueryInfo接口中active和currentWindow的类型是bool option(可选布尔类型),但实例化Query类时直接传入了bool类型的true,未包装成option类型,导致类型不匹配。同时F#要求实现接口时必须覆盖所有抽象成员,原代码未实现其余成员也会存在潜在问题。
正确实现方式
方式一:用Some包装布尔值传入
type Query(active: bool option, currentWindow: bool option) = interface Chrome.Tabs.QueryInfo with member _.active = active member _.currentWindow = currentWindow // 实现接口剩余成员,未用到的返回None member _.status = None member _.lastFocusedWindow = None member _.windowId = None member _.windowType = None member _.index = None member _.title = None member _.url = None member _.highlighted = None member _.discarded = None member _.autoDiscardable = None member _.pinned = None member _.audible = None member _.muted = None member _.groupId = None // 调用时用Some包装true query(Query(Some true, Some true))
方式二:简化构造参数,自动包装为option
修改类的构造参数为bool类型,内部自动包装成option,调用时更简洁:
type Query(active: bool, currentWindow: bool) = interface Chrome.Tabs.QueryInfo with member _.active = Some active member _.currentWindow = Some currentWindow // 实现接口剩余成员,未用到的返回None member _.status = None member _.lastFocusedWindow = None member _.windowId = None member _.windowType = None member _.index = None member _.title = None member _.url = None member _.highlighted = None member _.discarded = None member _.autoDiscardable = None member _.pinned = None member _.audible = None member _.muted = None member _.groupId = None // 直接传入bool值调用 query(Query(true, true))
方式三:匿名接口实现(临时传参更简洁)
无需定义类,直接用匿名接口实现传递参数:
query({ new Chrome.Tabs.QueryInfo with member _.active = Some true member _.currentWindow = Some true // 实现接口剩余成员,未用到的返回None member _.status = None member _.lastFocusedWindow = None member _.windowId = None member _.windowType = None member _.index = None member _.title = None member _.url = None member _.highlighted = None member _.discarded = None member _.autoDiscardable = None member _.pinned = None member _.audible = None member _.muted = None member _.groupId = None })
内容的提问来源于stack exchange,提问作者nevermind_15
相关产品推荐
相关产品推荐

