条件ブロック内のオブジェクトの型の制限(Type Guard)の一つのやり方としてユーザー定義(user defined)をする方法があります。typeof/instanceof/inによる方法もありますが、これらは全てインラインで行う必要がありますが、関数定義時点で型制限することで読みやすいコードになるでしょう。
<o’reillyのサンプル>
// user defined type guard
function isString(a: unknown): a is string {
// if a is not defined, parseInput isString cause error
return typeof a === "string";
}
function parseInput(input: string | number) {
let formatedInput: string;
if (isString(input)) {
formatedInput = input.toUpperCase();
console.log(formatedInput)
}
}
parseInput('qwerty')
<TypeScript Deep Diveのサンプル>
// TypeScript deep dive sample
interface Foo {
foo: number;
common: string;
}
interface Bar {
bar: number;
common: string;
}
function isFoo(arg: any): arg is Foo {
return arg.foo !== undefined;
}
function doStuff(arg: Foo | Bar) {
if (isFoo(arg)) {
console.log(arg.foo);
//console.log(arg.bar) // VScode detects as an error
console.log(arg.common);
} else {
//console.log(arg.foo) // error
console.log(arg.bar);
console.log(arg.common);
}
}
doStuff({ foo: 234, common: "abc" });
doStuff({ bar: 567, common: "efg" });
実行結果は、
QWERTY
234
abc
567
efg
どちらも xx is yyyで型を限定することで意図した動作を実現できます。
admin