【问题标题】:How to deal with unstructured data in F# similar to TypescriptF#中如何处理类似于Typescript的非结构化数据
【发布时间】:2021-10-26 09:52:28
【问题描述】:

在 NodeJs/TYpescript 中我可以声明一个接口

export interface IPageStatementLine {
  line: string
  sData: any
}

然后我可以访问函数中的数据:

function test (lineData: IPageStatementLine) {
    let mytext = lineData.mydynamicProperty.innerProperty
}

在 F# 中 - 显然,有更多的强类型,它不像 nodejs 那样“松散” - 但我想知道如何在 F# 中实现类似的事情

type PageStatementLine = {
    line: string
    sData: ??  option
}

我过去曾为 Some / None 值使用过选项,但我可以以某种方式将类型属性声明为非结构化吗?

让 myValue = lineData.sData.someProperty.someOtherProperty.

【问题讨论】:

  • 您正在寻找动态访问运算符。我找到了blog 。很快:您可以定义自己的运算符let (?) 并使用它以“动态”方式访问数据

标签: f#


【解决方案1】:

这是使用库 FSharp.Interop.Dynamic 的一种方法。这是为了在 FSI 中运行而编写的,因此 #r:

#r "nuget: FSharp.Interop.Dynamic"

open FSharp.Interop.Dynamic

("asdf"?Length:int) // returns 4

("asdf"?Length:string) // InvalidCastException

("asdf"?Foo:string) // Microsoft.CSharp.RuntimeBinder.RuntimeBinderException: 'string' does not contain a definition for 'Foo'

type PageStatementLine = {
    line: string
    sData: obj
}

let test (lineData: PageStatementLine) =
    let myText : string = lineData.sData?mydynamicProperty?innerProperty
    myText

这使用? 运算符。从上面的例子可以看出,调用动态属性后需要指定期望的返回类型。如果您指定了错误的类型或任何属性不存在,那么您将得到一个异常。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2017-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多