2017/11/06
普通に
普通に読み込むとエラーになります。
app.ts
import * as hoge from 'hoge';
推奨
ソースフォルダに適当な名前.d.tsファイルを作って以下の内容を書きます。
types.d.ts
declare module 'hoge';
あとは普通に読みこめばOKです。
app.ts
import * as hoge from 'hoge';
ワイルドカード
ワイルドカードも使えます。
types.d.ts
declare module '*';
非推奨
これでも一応出来ますが、あまりおすすめはしません。
app.ts
declare function require(path: string): any;
const hoge = require('hoge');
参考
https://github.com/Microsoft/TypeScript/issues/6615
2017/09/10
普通に書く
let arr1:(number|string)[]=['a','b','c',1,2,3];
let arr2=arr1.filter(x=>typeof x==='string');
arr2にはstringしか入ってないはずなのに型は(number|string)[]になってしまいます。
型ガード
let arr2 = arr1.filter<string>((x): x is string => typeof x === 'string');
これでarr2はstring[]になります。
注意
let arr2=arr1.filter<number>((x): x is number => typeof x === 'string');
このような事をしてもコンパイルエラーにはなりません。
arr2の実際の型はstring[]なのにTypeScriptはnumber[]と認識します。
キャストと同じように危険な操作なので注意しましょう。
他のライブラリ
immutable.jsやrxjsでも似たような事を出
2017/09/06
構文エラー
()=>{x:1}
長い
()=>{return {x:1};}
こうしよう
()=>({x:1})
2017/08/30
余計なタグとは
下記のようなテンプレートがあったとします。
//<my-msg>コンポーネント
<div>{{msg}}</div>
//使う
<my-msg [msg]="'はろー'"></my-msg>
reactやvue.jsの場合以下のように出力されます。
<div>はろー</div>
しかしAngularの場合は以下のように出力されます。
<my-msg><div>はろー</div></my-msg>
つまり余計なタグとは<my-msg>など独自コンポーネントのセレクターの事です。
一般的な場合の回避方法
selectorをdiv[myMsg]と指定し、テンプレートを以下のようにすることで回避する事が出来ます。
//定義
{{msg}}
//使用
<div myMsg [msg]="'はろー'"></div>
しかし、この方法はASTの再起では使えません。
(正確には使えないことはないがNodeの種類^2コピペしないといけないのでしたくない)
解決方法
ng-templateとngTemplateOu
2017/04/01
解決法
innerHTMLに設定するHTMLはデフォルトでサニタイズされるようになっており、iframeタグが自動的に除去されるのが原因でした。
サニタイズされるのはjavascriptだけだと思っていましたが、iframeも駄目みたいです。
import { DomSanitizer } from '@angular/platform-browser';
constructor(private sanitizer: DomSanitizer) {}
let innerHTML = this.sanitizer.bypassSecurityTrustHtml(html);
注意
サニタイズすると、iframeだけではなくjavascriptも埋め込み可能になるのでXSSには注意して下さい。
参考
Security - GUIDEDomSanitizer - API