昨日からVisual StudioでJavaScript / Node.jsを書いています。拡張子は「.ts」なんですが、JavaScriptを書いています。
Google Drive APIを使ってファイルをアップロードするコードを書いているのですが、@vvakameさんが作られたgapidtsで入れた型定義ファイルがサンプルコードに対して警告を返し、コード補完が効かなくなります。えええ、どうなってんの?サンプルコードだよ?
いろいろ調べた結果、以下の2つのことが起こっていました:
1. プロパティがすべて必須プロパティと解釈されている
Google Drive APIを使うモジュールの型定義ファイルの中を見てみましょう・・・んー?
interface IFile {
alternateLink: string;
appDataContents: boolean;
copyable: boolean;
createdDate: string; // date-time
defaultOpenWithLink: string;
description: string;
downloadUrl: string;
editable: boolean;
embedLink: string;
etag: string;
explicitlyTrashed: boolean;
exportLinks: {
[name:string]: string;
};
fileExtension: string;
...
おおお、全部必須プロパティになっている。これだと、どれか一つでもプロパティを指定しないと警告が出ます(ちなみにIFile
のプロパティはちょうど50個あります)。かといって全部にnull
を入れるのも何ですから、以下のようにオプショナルなプロパティにします(もちろん手作業ではなくて置換します)。
interface IFile {
alternateLink?: string;
appDataContents?: boolean;
copyable?: boolean;
createdDate?: string; // date-time
defaultOpenWithLink?: string;
description?: string;
downloadUrl?: string;
editable?: boolean;
embedLink?: string;
etag?: string;
explicitlyTrashed?: boolean;
exportLinks?: {
[name:string]: string;
};
fileExtension?: string;
...
これでコード補完が効くようになります。
なお、@ken_zookieさんには「型定義がメンテされるのに期待して any に逃げるのも、TypeScript だからこそできるベストエフォートタイピング」と教えてもらいました。なるほどー
2. 同じモジュールを使う型定義ファイルは1つにまとめる
今回使った2つの型定義ファイルは両方とも同じモジュールgoogleapis
の型定義ファイルでした。しかしこれだと「定義が2重になっている」と警告が出てコード補完が効かなくなります。
仕方がないので片方をコピーしてもう片方に貼り付け、適宜直しました。これで、コード補完が効くようになりました。
なんだか思ったより大変だな・・・まあでも問題は解決したので良しとしましょう!
ブログやってます:Weed software