コード
interface B {
b: string
}
interface A {
a: B
}
const isB = (arg: unknown): arg is B => {
return typeof arg === 'object' && arg != null && 'b' in arg && typeof arg.b === 'string'
}
const isA = (arg?: unknown): arg is A => {
return typeof arg === 'object' && arg != null && 'a' in arg && isB(arg.a)
}
説明
TypeScirpt4.9からif ('a' in arg)
と書くことによって、if文内ではarg
がRecord<'a', unknown>
と扱われる機能が追加されました。この機能により、これまで実質的に不可能だった型ガード関数の引数をunknown型にすることが可能となりました。ただし、この機能を使用するためにはarg
がobject
に絞り込まれている必要があり、そのためtypeof arg === 'object'
とarg != null
が必要になります。