🔥

TypescriptとJavascriptが混在しているときの対処メモ

2021/08/11に公開約1,500字

はじめに

  • Typescript 初心者です。
  • 既存の javascript のコードに typescript を混ぜ込んでいく時の色々をメモします。
  • tsc とかの導入は省略します。

メモ

document が undefined と言われる。

その .ts ファイルの先頭に

declare var document: Document;

を追加する。既に存在する document は Document 型であるという宣言。

Document 型は標準で d.ts を持ってくれているのでそのまま使える。

window が undefined と言われる

declare var window: Window & typeof globalThis;

Window 型は標準で d.ts を持ってくれているのでそのまま使える。

globalThis という謎の型は恐らく windows.* には global な変数も入ってしまうので、

そこをどうにかする宣言だと思われる。

document.getElementById("hoge") が possible null とか言われる。

  • TS2531: Object is possibly 'null'.
  • TS2345: Argument of type 'HTMLElement | null' is not assignable to parameter of type 'Element'. Type 'null' is not assignable to type 'Element'.

getElementById に指定した ID の要素が HTML 中に無ければ null が帰ってきてしまうから怒られている。

document.getElementById('hoge')! のように末尾に ! をつけると、null チェックをスルーできる。

…本当はちゃんとチェックするべきでしょうけども。

型に String と書いたものを引き渡そうとしたら警告された

  • TS2322: Type 'String' is not assignable to type 'string'. 'string' is a primitive, but 'String' is a wrapper object. Prefer using 'string' when possible.

string と String は別モノです。 恐らく、 String ではなく string で問題ないはず。

変数の定義を直しましょう。

console.log しようとしたら Cannot find name 'console'

`declare var console: Console;

window にプロパティを追加したいができない

  • TS2339: Property 'app' does not exist on type 'Window & typeof globalThis'.
`declare global {
    interface Window {
	myProperty: any;
    }
}
window.myProperty = console;  // 入れれる

any なのはサンプルだからで、型が解るなら型を入れた方がいい

Discussion

ログインするとコメントできます