如何注释类描述符

时间:2017-04-06 11:25:23

标签: typescript

如何正确注释以下内容:

@(Html.Kendo().ComboBoxFor(model => model.SalesOffice)
                            .Name("SalesOffice")
                            .HtmlAttributes(new { style = "width:300px" })
                            .DataTextField("SalesOffice")
                            .DataValueField("SalesOfficeID")
                            .Filter("Contains")
                            .DataSource(dataSource => dataSource
                                .Read(read =>
                                {
                                    read.Action("RequestHeader_SalesOffice", "Request")
                                        .Type(HttpVerbs.Post)
                                        .Data("GetFilterOption"); <-- This Bit
                                })
                                 .ServerFiltering(true)
                                ).CascadeFrom("SalesOrganisation") //<--This Bit

)

我确实理解错误,因为返回类型export class TestCls { static SomeStaticFn(): TestCls { // Do some stuff... // Return the class descriptor to allow a "fluid usage" of SomeStaticFn return TestCls; } } // TS error TS2339: Property 'SomeStaticFn' does not exist on type 'TestCls'. TestCls.SomeStaticFn().SomeStaticFn(); 注释了类&#34;本身&#34;而不是它的描述,但我不知道如何正确地注释这个...

Ps。:我不是100%肯定这里正确的术语(类&#34;本身&#34;,描述符等),并且非常感谢这里的一些更正。

1 个答案:

答案 0 :(得分:0)

这个问题起初可能听起来有些奇怪,但TypeScript抛出的原因是静态函数的签名。我希望以下是合理的:

如果使用类的名称(TestCls)来指定函数的返回值,则该函数应返回该类的实例。不是构造函数(=它的定义是你如何调用它)。这意味着,编写类似foo():MyClass的内容,TypeScript希望foo()返回MyClass的新实例,而不是类本身。

另外,定义这样的函数签名,TypeScript会尝试断言你给它的返回类型是正确的。所以:MyClass实际上是类型断言。这意味着您将覆盖TypeScript所引发的返回类型。

奇怪的是,如果你写这样的东西:

function hello (): string {
  return 5;
}

TypeScript会告诉您Type '5' is not assignable to type 'string'。我猜TypeScript无法真正区分该类及其实例是不同的。在一天结束时,他们都是object s。

tl; dr; 从静态函数中删除返回类型断言,一切都会好的。 TypeScript足够智能,无论如何都可以推断出返回类型。

export class TestCls {
    static SomeStaticFn() {
        // Do some stuff...

        // Return the class descriptor to allow a "fluid usage" of SomeStaticFn
        return TestCls;
    }
}

TestCls.SomeStaticFn().SomeStaticFn();