回答:
質問はすでに締め切られていますが、同じ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
getBBox
適切にキャストする方法はありますか?のタイプを知りたいgetBBox
ですか?
getBBox
になりますHTMLElement
タイプあなたがによってそれにオブジェクトをキャストできvar typedElement = <HTMLElement> outerHtmlElement;
。
var coordinates = (<any>outerElement[0]).getBBox();
迅速かつ汚い解決策は、明示的にキャストすることです 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
。したがって、この観点からは、他のオプションの方が優れています。
:any
か?
この問題を処理する方法はいくつかあります。このオブジェクトが外部ライブラリに関連している場合、最善の解決策は、そのライブラリの実際の定義ファイル(ここでは大きなリポジトリ)を見つけてそれを参照することです。例:
/// <reference path="/path/to/jquery.d.ts" >
もちろん、これは多くの場合当てはまりません。
型システムを「上書き」したい場合は、以下を試してください。
declare var y;
これにより、必要な通話を行うことができますvar y
。
/// <reference path="/path/to/jquery.d.ts" />
最後に自己終了タグを付ける必要があります
npm install -g tsd
場合tsd install jquery
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;
Angular2に問題があったため、ローカルストレージを使用して何かを保存していたため、保存できませんでした。
ソリューション:
持っていた localStorage.city -> error -> Property 'city' does not exist on type 'Storage'.
修正方法:
localStorage ['city']
(localStorage).city
(任意のlocalStorage)。
<any>
- を付ければ機能します(<any>localStorage).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
良い習慣ではありませんが、文字列リテラルをオフにする必要がないソリューションを提供します
HTMLElement
して追加のgetBBox
プロパティを持つインターフェースを作成することもできます。そうすれば、他のプロパティのコード補完が引き続き得られます。