1

我刚刚查看了一些示例

https://github.com/borisyankov/DefinitelyTyped

并注意到其中的一些库并不像我想象的那么容易上手和使用,但这可能是因为我还是 TypeScript 节目的新手。

所以让我印象深刻的第一件事(使用 Knockout 作为这里的例子),它都没有包含在一个模块中,我真的不认为这是一个主要问题,可能更多的是由谁做它的设计决定,但它看起来像它会更有意义(可能是因为我倾向于比其他语言做更多的 C#),因为它是自包含的,并且更容易在命名空间下包含其他插件:

i.e Knockout.ObservableString();

无论如何,第二点更多的是关于如何在现实世界的场景中使用这些实现,通常我会这样做:

function SomeClass() {
    var self = this;

    self.SomeObservable = ko.observable("default-value");
}

现在我期待做这样的事情:

/// The Ref
interface ISomeClass {
    SomeObservable: KnockoutObservableString;
}

class SomeClass implements ISomeClass {
    // What goes here?
}

现在假装有一些合乎逻辑的理由让我的 POJO(我想它现在应该被称为 POTO)一个接口然后实现它,因为通常我不会费心将接口放在任何具有 0 行为的东西上。

现在在上面的示例中,接口会很好,因为有一个KnockoutObservableString接口,但是我找不到实现,所以我不是打算使用该接口还是应该制作自己的实现?

我可以与某人一起为我指明方向并回答:

A) Why it wasn't written as a module?
B) How do you actually use the descriptors properly?
4

2 回答 2

1

描述符用于将类型应用于现有的 javascript 库,但它们不会重新定义库接口或在编译为 javascript 时导致任何更改。我认为这与您的两个问题有关:

A) 不能在模块中定义敲除描述符,因为敲除将 ko 定义为全局变量。假设ko已经在一个Knockout模块内定义了描述符。然后由 typescript 生成的生成的 javascript 将类似于SomeObservable = Knockout.ko.observable("default-value"),这是无效的。

B)在大多数情况下,在打字稿中调用敲除看起来与 javascript 相同。所以你可以做这样的事情:

class SomeClass implements ISomeClass {
    SomeObservable = ko.observable("default-value");
}

描述符文件为 ko.observable 定义了几个重载,接受字符串参数的重载返回一个 KnockoutObservableString。所以 ko 的实现和使用并没有真正改变太多......描述符真正给你的唯一东西是更多的类型安全性。

于 2013-03-22T23:51:03.033 回答
0

是的,我想我可能对这一切有更多的想法......

现在回答 B)我认为您应该通过包含它们来使用它们,例如:

declare var ko: KnockoutStatic

但是,如果您查看淘汰描述符的底部,它已经为您完成了,然后我认为您打算将接口用于您制作的接口,然后将 ko.xxx 用于您的实际实现,如下所示:

/// <reference path="knockout.d.ts" />

interface IPerson
{
    Forename: KnockoutObservableString;
    Surname: KnockoutObservableString;
}

class Person implements IPerson
{
    Forename = new ko.observable("");
    Surname = new ko.observable("");
}

虽然 Rubymine 5 似乎认为分配给 Forename 和 Surname 是无效的,但我不知道为什么 Visual Studio 似乎认为它没问题。

所以我希望其他人可以在这里验证我在正确的轨道上。

于 2013-03-22T22:54:06.123 回答