TypeScript
よい記事
in で型判定
code:in-type-check.ts
interface Hoge {
a: string;
}
interface Fuga {
b: string;
}
function(item: Hoge | Fuga) {
if ('a' in item) {
// item is Hoge
} else {
// item is Fuga
}
}
Union で受けて実装切り替えたいときとかに使う
例えば Date も firestore.Timestamp も props.date で受けとったときに
const date = 'toDate' in props.date ? props.date.toDate() : props.date;
のようにするとか
Optional Chaining
hoge?.fuga?.piyo のやつ
"Optional Chaining" という単語がでてこなくて困る
obj?.prop
obj?.[idx]
func?.(args)
function validate(input: any): input is Hoge { ... } ]
のような boolean を返す関数で引数が特定の型であることをチェックする
これも名前が出てこなくて、あの...あの is のやつ... と言っている
外部からの入力は unknown で受けてこれを通して特定の型として扱うと丁寧
Type-Only Imports and Export
3.8 から、実装を import しているのか型だけ参照しているのか曖昧なものが明になるので良い
code:type-only.ts
import type { SomeThing } from "./some-module.js";
...
export type { SomeThing };
Array を filter しているのに possibily undefined
User Defined Type Guard を使う
.filter((s: any): s is string => !!s)
ts-node で declared but its value is never read
REPL を起動して import にコケる場合、tsconfig.json で noUnusedLocals: true になって引っかかってる
$ ts-node -O '{"noUnusedLocals":false}' で起動する
ts-node で SyntaxError: Cannot use import statement outside a module
同様、module が commonjs 以外になってる
-O '{"module":"commonjs"}'
予約後を export
export 時の as で指定すればいける
code:export
declare let _default: string; // default is a reserved word
export { _default as default };
keyof typeof module
module の名前受け取りたいときとか
(namespace: keyof typeof vscode) => {...} みたいな
Record<string, unknown>
プロパティアクセスができるオブジェクトは↑にみなせる
unknown で受け取る type guard でよく使う
? でフィールド省略するのと値の undefined は違うよという話
code:optiona.ts
type PropOptional = {
field?: string
}
type ValueOptional = {
field: string | undefined;
}
const value = {}
const p: PropOptional = value;
const v: ValueOptional = value;
// => Property 'field' is missing in type '{}' but required in type 'ValueOptional'.
const p2: PropOptional = { field: undefined };
// ok
// これは個人的には良いと思えないが...