Typescriptの中のこと(浅め)

22
TypeScript ののののの ( のの )

description

 

Transcript of Typescriptの中のこと(浅め)

Page 1: Typescriptの中のこと(浅め)

TypeScriptの中のこと(浅め )

Page 2: Typescriptの中のこと(浅め)

自己紹介• @k_maru•主に MS系エンジニア• grunt-typescript作者

Page 3: Typescriptの中のこと(浅め)
Page 4: Typescriptの中のこと(浅め)
Page 5: Typescriptの中のこと(浅め)

typescript.js

grunt-typescript

各種クラス

> tsc

tsc.js

各種クラス

BatchCompiler

BatchCompiler ”モドキ”

Grunt Task

> grunt

grunt-typescript の場合tsc の場合

Page 6: Typescriptの中のこと(浅め)

tsc.js

typescript.js

typescriptService.js

parserとか scannerとか ASTとかコンパイルするための基本的なものがすべて入ってる。コンパイラーの基本セット

typescript.jsの内容に加えて、ファイル出力を担当する ioとかコマンドライン引数をパースするやつとか、BatchCompilerとかが入ってる。tscコマンドライン用

typescript.jsの内容に加えて、外部から利用する用のインターフェイスとかコードフォーマットとか括弧のマッチングとかが入ってる。主にエディタサポート用

Page 7: Typescriptの中のこと(浅め)

typescriptService.jsの手に入れ方•自分でソースからコンパイルしましょう。> git clone https://git01.codeplex.com/typescript TypeScript> cd TypeScript> npm install> node_modules/.bin/jake local> cd built/local> lsjquery.d.ts tsc.d.ts typescript.d.ts typescriptServices.d.ts winjs.d.tslib.d.ts tsc.js typescript.js typescriptServices.js winrt.d.ts

•もしくは LKG(Last Known Good)を使いましょう。 d.tsはないけど…

> git clone https://git01.codeplex.com/typescript TypeScript> cd TypeScript/bin> lsjquery.d.ts lib.d.ts resources tsc tsc.js typescript.js typescriptServices.js winjs.d.ts winrt.d.ts

Page 8: Typescriptの中のこと(浅め)

BatchCompilerがやっている動きをざっくり追いながら中のお話を浅ーくしていきます。

Page 9: Typescriptの中のこと(浅め)

参照関係の解決

コマンドライン引数のパース

コンパイル

Page 10: Typescriptの中のこと(浅め)

参照関係の解決

コマンドライン引数のパース

コンパイル

Page 11: Typescriptの中のこと(浅め)

nodeで実行-w / --watchオプションがある

wshで実行--codepage オプションがある

Page 12: Typescriptの中のこと(浅め)

コマンドラインで指定可能なオプション• OptionParserでパースして CompilationSettingsを作成

-documented out outDir sourcemap mapRoot sourceRoot declaration removeComments target module help version noImplicitAny

-documented(node only) watch

-documented(wsh only) codepage

-undocumented diagnostics locale noResolve noLib logFile propagateEnumConstants useCaseSensitiveFileResoltionコンパイル詳細情報を表示してくれ

メッセージのロケールを設定する

コンパイル結果をファイルに出力してくれる

Page 13: Typescriptの中のこと(浅め)

内部的なオプションの設定

export class CompilationSettings { public propagateEnumConstants: boolean = false; public removeComments: boolean = false; public watch: boolean = false; public noResolve: boolean = false; public allowAutomaticSemicolonInsertion: boolean = true; public noImplicitAny: boolean = false; public noLib: boolean = false; public codeGenTarget: LanguageVersion = LanguageVersion.EcmaScript3; public moduleGenTarget: ModuleGenTarget = ModuleGenTarget.Unspecified; public outFileOption: string = ""; public outDirOption: string = ""; public mapSourceFiles: boolean = false; public mapRoot: string = ""; public sourceRoot: string = ""; public generateDeclarationFiles: boolean = false; public useCaseSensitiveFileResolution: boolean = false; public gatherDiagnostics: boolean = false; public codepage: number = null public createFileLog: boolean = false;}

settings.ts

勝手にセミコロンを設定してくれる

Page 14: Typescriptの中のこと(浅め)

参照関係の解決

コマンドライン引数のパース

コンパイル

Page 15: Typescriptの中のこと(浅め)

///<reference path="hello.ts" /> import log = require("./log"); var result = hello("TypeScript");log.message(result);

index.tshello.tsを対象に追加

参照を確認してコンパイル対象に自動で設定する

log.tsを対象に追加

> ls index.ts hello.ts log.ts> tsc index.ts --module commonjs

Page 16: Typescriptの中のこと(浅め)

参照の確認の流れ

tokenを作る

importキーワードを探す

いろいろ条件指定して一致したら追加

referenceコメントを探す

いろいろ条件指定して一致したら追加

Page 17: Typescriptの中のこと(浅め)

--noResolveオプション

--module指定が必要な構成だとエラーになる。ただし、上記ではなくかつオプションに全ファイルを指定できるのならコンパイルは速くなる。副作用の詳細は不明

Page 18: Typescriptの中のこと(浅め)

参照関係の解決

コマンドライン引数のパース

コンパイル

Page 19: Typescriptの中のこと(浅め)

コンパイルの流れ

TypeScriptCompilerオブジェクトの作成

コンパイル対象のファイルを全部コンパイラーオブジェクトに追加

コンパイルの実行

シンタックスの確認

セマンティックの確認

オプションの整合性の確認

JavaScriptの生成 (Emit)

型定義の生成 (EmitDeclaration)

ファイルの出力

ポイントその 1ASTは要求された時に初めて生成される。つまりコンパイル内のステップを飛ばしても問題ない。

ポイントその 2セマンティックに問題があっても Emitは実行される。→エラーが出てるのにファイルが作成されるって現象はこれが理由

Page 20: Typescriptの中のこと(浅め)

おまけ

Page 21: Typescriptの中のこと(浅め)

Undocumented TripleSlashComment

///<implicit-import />

///<amd-dependency path=“” />

///<reference no-default-lib="true"/>

--module amd でコンパイルした時に pathで指定した値が生成されるJavaScriptの defineに組み込まれる。domreadyとかによさげ

外部モジュールとして取り扱われる。使いどころ不明

参照関係の解決時にこれが指定されたファイルが見つかると lib.d.tsが読み込まれなくなる。ご利用は計画的に

Page 22: Typescriptの中のこと(浅め)

ご清聴ありがとうございました。