我刚刚查看了
中的一些例子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?
答案 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似乎认为没问题。
所以我希望其他人可以在这里验证我的正确轨道。