221

私はこれをやろうとしています:

var script:HTMLScriptElement = document.getElementsByName("script")[0];
alert(script.type);

しかし、それは私にエラーを与えています:

Cannot convert 'Node' to 'HTMLScriptElement': Type 'Node' is missing property 'defer' from type 'HTMLScriptElement'
(elementName: string) => NodeList

正しいタイプにキャストしない限り、スクリプト要素の「タイプ」メンバーにアクセスできませんが、これを行う方法がわかりません。ドキュメントとサンプルを検索しましたが、何も見つかりませんでした。

4

14 に答える 14

283

TypeScriptはキャストを囲むために「<>」を使用するため、上記は次のようになります。

var script = <HTMLScriptElement>document.getElementsByName("script")[0];

ただし、残念ながら、次のことはできません。

var script = (<HTMLScriptElement[]>document.getElementsByName(id))[0];

エラーが発生します

Cannot convert 'NodeList' to 'HTMLScriptElement[]'

しかし、あなたはすることができます:

(<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
于 2012-10-02T08:47:36.087 に答える
36

TypeScript 0.9 の時点で、lib.d.tsファイルは への呼び出しに対して正しい型を返す特殊なオーバーロード シグネチャを使用しますgetElementsByTagName

これは、型アサーションを使用して型を変更する必要がなくなったことを意味します。

// No type assertions needed
var script: HTMLScriptElement = document.getElementsByTagName('script')[0];
alert(script.type);
于 2014-01-15T23:48:40.120 に答える
21

次を使用して、いつでも型システムをハックできます。

var script = (<HTMLScriptElement[]><any>document.getElementsByName(id))[0];
于 2012-10-02T19:22:27.400 に答える
9

明確にするために、これは正しいです。

「NodeList」を「HTMLScriptElement[]」に変換できません

aNodeListは実際の配列ではありません (たとえば.forEach.slice.push、 などは含まれません)。

したがって、型システムに変換された場合、コンパイル時にメンバーHTMLScriptElement[]を呼び出そうとしても型エラーは発生しませんが、実行時には失敗します。Array.prototype

于 2012-10-02T19:19:03.567 に答える
3

[index: TYPE]これは、配列アクセス型を使用して問題を解決しているようです。

interface ScriptNodeList extends NodeList {
    [index: number]: HTMLScriptElement;
}

var script = ( <ScriptNodeList>document.getElementsByName('foo') )[0];
于 2012-10-05T08:37:09.460 に答える
1

TypeScript が NodeList の代わりに HTMLCollection を戻り値の型として定義する場合、宣言ファイル (lib.d.ts) で解決できます。

DOM4 もこれを正しい戻り値の型として指定していますが、古い DOM 仕様はあまり明確ではありません。

http://typescript.codeplex.com/workitem/252も参照してください。

于 2012-11-08T20:32:58.177 に答える
1

sitepenガイドもお勧めします

https://www.sitepen.com/blog/2013/12/31/definitive-guide-to-typescript/ (下記参照) および https://www.sitepen.com/blog/2014/08/22/advanced -typescript-concepts-classes-types/

TypeScript では、正確な文字列が関数の引数として提供される場合に、さまざまな戻り値の型を指定することもできます。たとえば、DOM の createElement メソッドに対する TypeScript のアンビエント宣言は次のようになります。

createElement(tagName: 'a'): HTMLAnchorElement;
createElement(tagName: 'abbr'): HTMLElement;
createElement(tagName: 'address'): HTMLElement;
createElement(tagName: 'area'): HTMLAreaElement;
// ... etc.
createElement(tagName: string): HTMLElement;

つまり、TypeScript では、たとえば document.createElement('video') を呼び出すと、TypeScript は戻り値が HTMLVideoElement であることを認識し、assert と入力する必要なく DOM Video API と正しくやり取りしていることを確認できます。

于 2015-08-25T18:35:18.077 に答える
0

ではNodeListなく であるためArray、実際にはブラケットを使用したり、 にキャストしたりしないでくださいArray。最初のノードを取得するプロパティの方法は次のとおりです。

document.getElementsByName(id).item(0)

あなたはそれをキャストすることができます:

var script = <HTMLScriptElement> document.getElementsByName(id).item(0)

または、次のように拡張しNodeListます。

interface HTMLScriptElementNodeList extends NodeList
{
    item(index: number): HTMLScriptElement;
}
var scripts = <HTMLScriptElementNodeList> document.getElementsByName('script'),
    script = scripts.item(0);
于 2013-12-19T17:09:31.887 に答える