諸事情により React で TypeScript な web アプリの中から window に global な変数を write access する方法のメモ
Window
をオレオレ派生した interface
をでっちあげてキャストすれば window
の任意のプロパティーに write access できる。後は野となれ山となれ。
↓例、React の state 持ちの Component な App のインスタンスを window.app
な global 変数として登録:
App.tsx:
// 凡例 ☆ := 本質的な部分 // 凡例 ◎ := おまけ, state を扱う部分 // ☆Window を派生して app 変数を持ったインターフェースをでっちあげる interface IGlobalWindow extends Window{ app?: App; } // ◎ これらは constructor で state を定義したい場合に必要なインターフェース interface IProps {} interface IState { aaa?: any; } export default class App extends Component<IProps, IState> { constructor( props: IProps ) { super(props); // ◎ ctor ではトリアエズ {} な aaa を this: App の .state 放り込んでおいてみます this.state = { aaa: {} } // ☆ window をオレオレ派生したインターフェースに明示的にキャストした上で .app 変数に書き込み; このメモの本質的な部分です (window as IGlobalWindow).app = this; } componentDidMount() { // ◎ 適当なタイミングで App の state を設定してみます this.setState( { aaa: 123 } ); } }
↑こうすると、ウェブブラウザーの inspector ツール的なそれの Console からも↓のように App のインスタンスやそのプロパティーにアクセスできるようになります:
> app.state.aaa < 123
おまけメモ: React Developer Tools
- Firefox https://addons.mozilla.org/ja/firefox/addon/react-devtools/
- Chrome https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi
- Edge https://microsoftedge.microsoft.com/addons/detail/react-developer-tools/gpphkfbcpidddadnkolkpfckpihlkkil
これをブラウザー側へ入れられる場合は、導入後に React のページを読み込むと $r
で React の Root にぶちこんだ App
のインスタンスにアクセスできるようになります。今回のメモの主題とは異なりますが、外から中を見たいだけなら素直に React Developer Tools を入れればよいです。