Typescriptエラーを無視する「プロパティはタイプの値に存在しません」


227

VS2013では、tscがコード1で終了すると、ビルドが停止します。これは、VS2012では当てはまりませんでした。

tsc.exeエラーを無視してソリューションを実行するにはどうすればよいですか?

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

回答:


303

質問はすでに締め切られていますが、同じ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

14
また、拡張HTMLElementして追加のgetBBoxプロパティを持つインターフェースを作成することもできます。そうすれば、他のプロパティのコード補完が引き続き得られます。
thetallweeks 2014

にキャストする代わりに、getBBox適切にキャストする方法はありますか?のタイプを知りたいgetBBoxですか?
Pardeep Jain

FE:場合getBBoxになりますHTMLElementタイプあなたがによってそれにオブジェクトをキャストできvar typedElement = <HTMLElement> outerHtmlElement;
michalczukm 2016年

4
いいね! var coordinates = (<any>outerElement[0]).getBBox();
ボウプニャ2016年

1
「どのようにエラーを無視する」:これは実際に質問に答えていません
ペトルペラ

122

迅速かつ汚い解決策は、明示的にキャストすることです 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

おかげでこれを助けた:import http = require( 'http'); var server = http as any; server.Server(app); // tsエラーを無視します!
2016年

「NodeRequireでプロパティが見つからないことを確認する」でこれを使用しました。そのため、NodeRequiredでrequire変数を宣言し、(必要に応じて)プロパティを確認します。お役に立てれば。
Juni Brosas

61

次のトリックも使用できます。

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

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

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


4
なぜこれが機能するのか、これがオブジェクトを最初に宣言することよりも潜在的な影響や利点があるかどうか誰か知っています:anyか?
mcheah 2018年

タイプにキャストするのではなく、タイピングを維持するという明らかな利点があります。私は、これは警告をスローしない理由を知りたいのですが、...直接んアクセス
Powderham

38

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

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

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

型システムを「上書き」したい場合は、以下を試してください。

declare var y;

これにより、必要な通話を行うことができますvar y


5
/// <reference path="/path/to/jquery.d.ts" />最後に自己終了タグを付ける必要があります
tic 2015年

私はVS2015を使用していて、このチュートリアルに参加しjquery.d.tsました。プロジェクトにファイルがないため、角張っています
Dimple

@Dimpleのnpm install -g tsd場合tsd install jquery
Akash

2番目のオプション(declare var y)は、JavaScriptからTypeScriptに移行していて、古いJavaScriptが別のJavaScriptファイルの変数を参照しているため、エラーTS2304を回避したい場合に最適です。
yesman

ありがとう!私にとっての問題は、Jest、const mockPromptに関するものでした:any = jest.spyOn(step、 'prompt');
Mark Robson、

18

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;

1
スーパーでは動作しません。タイピングを使用してクラスを拡張し、作成者がパブリックメソッドを忘れた場合は、かなり手間がかかります。これをタイプ定義に追加する必要があります。これは、次のnpmインストールで停止し、プルリクエストを作成するか、または作成者に通知するように強制します。これはおそらく良いことですが、苦痛です。
Corey Alix

15

Angular2に問題があったため、ローカルストレージを使用して何かを保存していたため、保存できませんでした。

ソリューション:

持っていた localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.

修正方法:

localStorage ['city']

(localStorage).city

(任意のlocalStorage)。


2番目のオプションは見栄えは良いですが、もう仕事をしていないようです。オブジェクトの前に<any>- を付ければ機能します(<any>localStorage).city
jayarjo

私はこれが古いことを知っていますが、あなたのトップの例は私のためにうまくいきました。
MacD

4

他に何も機能しない場合の簡単な修正:

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

良い習慣ではありませんが、文字列リテラルをオフにする必要がないソリューションを提供します


私もこれを行いますが、一部のプラットフォーム(Google Cloudなど)では、abがa ['b']よりも優れていることを示す警告メッセージが表示されます。これがなぜか知っていますか?
ジョナサン

1
確かではありませんが、たとえばtslint.jsonで、オプションを変更してabを優先することができます
danday74

3

今は2020年だと思いますが、質問の「無視」の部分を満足する答えは見つかりませんでした。結局のところ、ディレクティブを使用してTSLintにそれを実行するように指示できます。

// @ts-ignore
this.x = this.x.filter(x => x.someProp !== false);

通常、これは「somePropがタイプに存在しない」ことを示すエラーをスローします。コメントがあれば、そのエラーはなくなります。

これにより、コンパイル時にスローされるエラーがすべて停止し、IDEによる不満も解消されます。


0

私の特定のプロジェクトでは、それを機能させることができず、使用しましたdeclare var $;クリーンで推奨されるソリューションではありません。JQuery変数を認識しませんが、それを使用した後にエラーは発生しませんでした(自動ビルドが成功するために必要でした)。


0

私は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のキーとして使用してコンパイルできる唯一の方法のようです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.