1

私はちょうどからの例のいくつかを見てきました

https://github.com/borisyankov/DefinitelyTyped

そして、そこにあるライブラリのいくつかは、思ったほど簡単に入手して使用できないことに気づきましたが、これはおそらく、私がまだTypeScriptショーの初心者であるためです。

だから私を最初に驚かせたのは(ここでの例としてノックアウトを使用して)、モジュールには含まれていません。これはおそらく大きな問題ではないと思いますが、おそらく誰がそれを作ったのかという設計上の決定ですが、自己完結型であり、名前空間の下に他のプラグインを含めるのが簡単なため、(おそらく他の言語よりも多くのC#を実行する傾向があるため)より理にかなっています。

i.e Knockout.ObservableString();

とにかく、2番目のポイントは、通常、次のようなことを行うように、実際のシナリオでこれらの実装を使用する方法についてです。

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)ほとんどの場合、typescript内でノックアウトを呼び出すことは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への割り当てが無効であると考えているようですが、VisualStudioが問題ないと考えている理由はわかりません。

ですから、他の誰かがここで正しい軌道に乗っていることを確認できることを願っています。

于 2013-03-22T22:54:06.123 に答える