有没有办法默认使用 JavaScript 属性?

5

我只是想表达“我希望这个项目中的所有方法都使用[JavaScript]”的意思。手动注释每个方法很烦人。


不仅如此,而且也不应该这样 - 服务器端方法不能用[<JavaScript>]进行注释(因为它们使用的功能在客户端不可用)。 - Ramon Snir
我也觉得代码中充斥着[<Javascript>]非常令人讨厌。这是我决定使用Typescript的原因之一。可能的解决方案之一是将整个模块或类标记为JavaScript。不过这是否可行呢? - Oldrich Svec
可以的,可以查看我的答案作为一个例子。 - Taha
3个回答

6

F# 3允许您使用ReflectedDefinition属性(在WebSharper中称为[JavaScript])来标记模块,并标记所有方法。

请参见有关F# 3.0语言功能的更多信息:

(说起不常见的属性,在F# 3.0中,现在可以将[<ReflectedDefinition>]属性放置在模块和类型定义上,作为一种缩写方式,以应用于每个单独的模块/类型成员。)


1
你可以查看我的最近的FunScript示例(我认为相同的代码结构也适用于WebSharper):https://github.com/tpetricek/Documents/blob/master/Talks%202013/Love%20The%20Data%20(Channel9)/code/WorldBank.Web/Page.fs - Tomas Petricek

3
我认为Phil的答案是正确的——当你可以标记整个模块或类型时,它不会增加太多噪音,而且还允许你在WebSharper中区分服务器端和客户端代码。
仅供记录,F#编译器是开源的,因此某人(认为这个问题很重要的人)可以轻松地创建一个分支,添加一个附加的命令行属性来覆盖设置。我认为这只是添加参数,然后在check.fs中设置reflect标志的默认值的问题(这里是GitHub上的源代码)。
目前,主要的F#存储库不接受添加新功能的贡献(请参见此处的讨论),但这肯定是向F#团队发送功能请求的好方法 :-)

2
如果你在代码中使用JavaScript属性进行注释,WebSharper编译器会尝试将所有内容转换为JavaScript。在WebSharper开发中的一个经验法则是将服务器端和客户端代码分开,因此如果你的目标是.NET 4.5,只需对包含客户端代码的模块/类进行注释即可,而不需要对每个函数/成员进行注释。
namespace Website

open IntelliFactory.WebSharper

module HelloWorld =

    module private Server =

        [<Rpc>]
        let main() = async { return "World" }

    [<JavaScript>] // or [<ReflectedDefinition>]
    module Client =

        open IntelliFactory.WebSharper.Html

        let sayHello() =
            async {
                let! world = Server.main()
                JavaScript.Alert <| "Hello " + world
            }

        let btn =
            Button [Text "Click Me"]
            |>! OnClick (fun _ _ ->
                async {
                    do! sayHello()
                } |> Async.Start)

        let main() = Div [btn]

    type Control() =

        inherit Web.Control()

        [<JavaScript>]
        override __.Body = Client.main() :> _

我只使用WebSharper来替换JavaScript,所以我并不真正关心服务器端,无论如何,模块注释比方法更好。 - ais

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接