web-dev-qa-db-ja.com

TypeScriptエラーを無視 "プロパティはtypeの値に存在しません"

VS2013では、tscがコード1で終了すると建物が停止します。これはVS2012ではそうではありませんでした。

Tsc.exeエラーを無視して私の解決策をどうやって実行できますか?

JavaScript関数を使用するときに無視したいThe property 'x' does not exist on value of type 'y'エラーがたくさんあります。

165
daniel

私はその質問がすでに閉じられていることを知っていますが、私はそれが同じ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();

編集、2016年後半

TypeScript 1.6の推奨キャスト演算子はasなので、これらの行はエレガントにまとめることができます。

let coordinates = (outerElement[0] as any).getBBox();


その他の解決策

あなたがそれを正しくしたいのであればもちろん、それは時々やり過ぎです、あなたは次のことができます。

  1. 単にHTMLElementを拡張する独自のインターフェースを作成する
  2. HTMLElementを拡張する独自の型付けを導入する
232
michalczukm

早くて汚い解決策は明示的に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
94
Bruno Grieder

次のようなトリックを使うこともできます。

y.x = "some custom property"//gives TypeScript error

y["x"] = "some custom property"//no errors

xにアクセスして再度TypeScriptエラーが発生しないようにするには、y["x"]ではなく、y.xのように記述する必要があります。だからこの観点から他のオプションが優れています。

51

この問題を処理する方法はいくつかあります。このオブジェクトが外部ライブラリに関連している場合、そのライブラリの実際の定義ファイル(ここでは素晴らしいリポジトリ)を見つけて参照することが最善の解決策です例:

/// <reference path="/path/to/jquery.d.ts" >

もちろん、これは多くの場合には当てはまりません。

型システムを「オーバーライド」したい場合は、次のことを試してください。

declare var y;

これにより、var yに対して必要な呼び出しを行うことができます。

37
Charles Marsh

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;
15

Angular 2で問題が発生した場合は、ローカルストレージを使用して何かを保存していましたが、それは不可能でした。

解決策:

私はlocalStorage.city -> error -> Property 'city' does not exist on type 'Storage'.を持っていました

それを修正する方法:

localStorage ['都市']

(localStorage).city

(localStorage any any).city

12
Avram Virgil

他に何もうまくいかない簡単な修正:

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

悪い習慣ではありませんが、文字列リテラルなしをオフにする必要なしに解決策を提供します

3
danday74

私は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のマップとコンパイルのためのキーとして使うことができる唯一の方法のようでした。

0
cs_pupil

私の特定のプロジェクトでは、うまく動作させることができず、declare var $;を使用しました。 きれいで推奨された解決策ではありません、それはJQuery変数を認識しません、しかし私はそれを使用した後エラーがありませんでした。 ).

0
Randy