使用TypeScript描述符文件的方法,例如Knockout.d.ts

时间:2013-03-22 17:44:12

标签: javascript knockout.js typescript

我刚刚查看了

中的一些例子

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?

2 个答案:

答案 0 :(得分:1)

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

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

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

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

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

答案 1 :(得分: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似乎认为没问题。

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

相关问题