VS2013では、tscがコード1で終了すると建物が停止します。これはVS2012ではそうではありませんでした。
Tsc.exeエラーを無視して私の解決策をどうやって実行できますか?
JavaScript関数を使用するときに無視したいThe property 'x' does not exist on value of type 'y'
エラーがたくさんあります。
私はその質問がすでに閉じられていることを知っていますが、私はそれが同じTypeScriptExceptionを探しているのを見つけました。
この問題は、TypeScriptの型が足りないことに起因します。
var coordinates = outerElement[0].getBBox();
The property 'getBBox' does not exist on value of type 'HTMLElement'.
を投げます
最も簡単な方法は、変数をany
として明示的に入力することです。
var outerHtmlElement: any = outerElement[0];
var coordinates = outerHtmlElement.getBBox();
TypeScript 1.6の推奨キャスト演算子はas
なので、これらの行はエレガントにまとめることができます。
let coordinates = (outerElement[0] as any).getBBox();
あなたがそれを正しくしたいのであればもちろん、それは時々やり過ぎです、あなたは次のことができます。
HTMLElement
を拡張する独自のインターフェースを作成するHTMLElement
を拡張する独自の型付けを導入する早くて汚い解決策は明示的にany
にキャストすることです
(y as any).x
「利点」は、キャストが明示的であることで、これはnoImplicitAny
フラグが設定されていてもコンパイルされることです。
適切な解決策は、タイピング定義ファイルを更新することです。
あなたがany
に変数をキャストするとき、あなたはその変数の型チェックからオプトアウトすることに注意してください。
私は免責モードになっているので、any
を介したダブルキャスティングと新しいインターフェースを組み合わせることは、あなたが以下のような状況で役に立ちます。
まだ、あなたはまだ何らかの形のタイピングが欲しいのです。
y
型のOrginalDef
のインスタンスの定義に、x
型の新しいプロパティーnumber
を使用してパッチを適用するとします。
const y: OriginalDef = ...
interface DefWithNewProperties extends OriginalDef {
x: number
}
const patched = y as any as DefWithNewProperties
patched.x = .... //will compile
次のようなトリックを使うこともできます。
y.x = "some custom property"//gives TypeScript error
y["x"] = "some custom property"//no errors
x
にアクセスして再度TypeScriptエラーが発生しないようにするには、y["x"]
ではなく、y.x
のように記述する必要があります。だからこの観点から他のオプションが優れています。
この問題を処理する方法はいくつかあります。このオブジェクトが外部ライブラリに関連している場合、そのライブラリの実際の定義ファイル(ここでは素晴らしいリポジトリ)を見つけて参照することが最善の解決策です例:
/// <reference path="/path/to/jquery.d.ts" >
もちろん、これは多くの場合には当てはまりません。
型システムを「オーバーライド」したい場合は、次のことを試してください。
declare var y;
これにより、var y
に対して必要な呼び出しを行うことができます。
TypeScriptがそのプロパティ "x"が "y"に存在しないと考えるときそれから、あなたはいつでも "y"を "any"にキャストすることができます。これは "y"の上で( "x"のような)何かを呼び出すことを可能にします。
理論
(<any>y).x;
現実世界の例
このコードに対して、「TS2339:プロパティ 'name'はタイプ 'Function'に存在しません」というエラーが表示されました。
let name: string = this.constructor.name;
だから私はそれを修正しました:
let name: string = (<any>this).constructor.name;
Angular 2で問題が発生した場合は、ローカルストレージを使用して何かを保存していましたが、それは不可能でした。
解決策:
私はlocalStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
を持っていました
それを修正する方法:
localStorage ['都市']
(localStorage).city
(localStorage any any).city
他に何もうまくいかない簡単な修正:
const a.b = 5 // error
const a['b'] = 5 // error if ts-lint rule no-string-literal is enabled
const B = 'b'
const a[B] = 5 // always works
悪い習慣ではありませんが、文字列リテラルなしをオフにする必要なしに解決策を提供します
私はTypeScriptでこれを乗り越えることができました。
let x = [ //data inside array ];
let y = new Map<any, any>();
for (var i=0; i<x.length; i++) {
y.set(x[i], //value for this key here);
}
これが、私がXの中の値をYのマップとコンパイルのためのキーとして使うことができる唯一の方法のようでした。
私の特定のプロジェクトでは、うまく動作させることができず、declare var $;
を使用しました。 きれいで推奨された解決策ではありません、それはJQuery変数を認識しません、しかし私はそれを使用した後エラーがありませんでした。 ).