as による型アサーション

const test = {} // ここでTSは testの型はプロパティがゼロのオブジェクトね! と型推論する

test.foo = 123  // numberなのでコンパイルエラー!!

interface Test {
  foo: number
}

const test = {} as Test
test.foo = 123   // OK!!

型ガードでスマートに型安全を保証する

const foo: unknown = '1,2,3,4';

if (typeof foo === 'string') {
	console.log(foo.split(','));
}

console.log(foo.split(',')); // compile error!

ユーザー定義型ガード

function isStringOrNumber(value: unknown): value is string | number {
  return typeof value === "string" || typeof value === "number";
}

// 使い方
function useUnknown(v: unknown) {
  // v はここでは unknown 型
  if (isStringOrNumber(v)) {
    // v はここでは string | number 型
    console.log(v.toString());
  }
}