TSをReact/Reduxアプリに追加しました。
私はアプリでwindow
オブジェクトを次のように使用します:
componentDidMount() {
let FB = window.FB;
}
TSはエラーをスローします。
TypeScriptエラー:プロパティ 'FB'がタイプ 'Window'に存在しません。 TS2339
エラーを修正したい。
// Why doesn't this work? I have defined a type locally
type Window = {
FB: any
}
componentDidMount() {
let FB = window.FB;
}
// TypeScript error: Property 'FB' does not exist on type 'Window'. TS2339
私はここで答えを見つけました https://stackoverflow.com/a/56402425/1114926
declare const window: any;
componentDidMount() {
let FB = window.FB;
}
// No errors, works well
FBプロパティをまったく指定していなくても、なぜ最初のバージョンは機能しませんが、2番目のバージョンは機能しますか?
_declare const window: any;
_を使用する理由
タイプany
のローカル変数を宣言するからです。タイプany
を使用すると、本質的にwindow
のタイプチェックがオフになるため、それを使用して何でも実行できます。私はこのソリューションをお勧めしません、それは本当に悪いものです。
なぜ_type Window = { FB: any }
_が機能しないのですか?タイプWindow
を定義します。このタイプは、モジュールで定義されている場合、グローバルwindow
オブジェクトのタイプとは関係なく、たまたまモジュール内でWindow
と呼ばれるだけのタイプです。
良い解決策window
を拡張するには、グローバルWindow
インターフェースを拡張する必要があります。これは次のようにして行うことができます:
_declare global {
interface Window {
FB:any;
}
}
let FB = window.FB; // ok now
_
この拡張機能は、定義したファイルだけでなく、プロジェクト全体で使用できることに注意してください。また、FB
に定義がある場合は、少しよく入力することを検討してください(FB: typeof import('FBOrWhateverModuleNameThisHas')
)