0

data.js の TypeScript 百科事典のサンプル コードでは、何も達成していないように見える double 型アサーションが使用されています。

export interface Group {
  key: string;
  title: string;   
}

interface Groups {
  [idx: string]: Group;
}

var groupsHash = **<Groups>(<any>**{ 
  recent: { key: 'recent', title: 'Recent' },
  favorites: { key: 'favorites', title: 'Favorites' },
  today: { key: 'today', title: 'Today' },
  nearby: { key: 'xxnearby', title: 'Nearby' }
});

実際、これらの型アサーションを使用すると、これらの型アサーションが存在しない場合に何が起こるかではなく、あらゆる種類のものを Intellisense に追加するため、groupsHash 変数の使用が難しくなるようです。誰かが私にそれらを説明できますか? ありがとう!

4

1 に答える 1

2

そのオブジェクトへの唯一の参照は、コンパイラがキャストのためにタイプであると推測する変数を<any>介するため、キャストは必要なく、何にも影響しません。コードを書いた人がこのように書いた理由はよくわかりません.Groupsへの直接キャストは私の試みではうまくいくようです-おそらくコードはそれを必要とする以前のバージョンのコンパイラ用に書かれたのでしょうか?groupHashGroups<Groups>

そうは言っても、コンパイラが groupHash で持つべき唯一の型情報は、Groups インターフェイスを実装する何らかのオブジェクトを参照することであるため、「Intellisense にあらゆる種類のものを追加する」と言ったときに何を意味するのかわかりません。このコードをいじっていたとき、「any」への中間キャストを使用してもまったく違いはありませんでした。VS 2012 Express は、文字列キーでブラケット プロパティ アクセス表記を使用するまで、groupHash のオートコンプリートを提供しませんでした。その時点で、グループの「キー」および「タイトル」プロパティが期待どおりにリストされました。

編集:おそらくタイプキャストがまったくないことを意味していることに気付きました。その時点で、「groupHash」のタイプは、そのオブジェクトリテラルの完全に推測されたシグネチャになります(したがって、定義内の4つのプロパティはすべてインテリセンスによってリストされます)。

これが行われなかった理由は、「groupHash」がハッシュテーブルとして使用されることを意図しているためです。そのため、実行時にプロパティを動的に追加および削除できます。Groups インターフェースにキャストせずにそのように使用することはできますが、オブジェクトをどのように使用するつもりなのかは明確ではありません。つまり、新しいプログラマーはコードを見て、それらの 4 つのプロパティがあることを確認し、この静的型がプログラムの存続期間を通じて維持されると想定します。そしてそれから削除されました。

于 2012-10-16T02:54:52.547 に答える