プリミティブ型なのかオブジェクトなのか調べたい時は typeofでしらべる
object とか number などの文字列が返ります。
オブジェクトがclassの場合は instanceof でClass判定ができる。こんな感じ
class Foo{
hoge:string
}
class Bar{
fuga:string
}
function doStuff(arg: Foo | Bar) {
if (arg instanceof Foo) {
// Fooのとき
}
if (arg instanceof Bar) {
// Barのとき
}
}
別の方法として object.constructor.name でClass名が取れる様だが、Type定義(型エイリアス)だと’Object’としか入ってない様でダメでした。
vue.jsで、元の型とRef<>型の両方を受け取れる様にして、どちらか判定して 返す様な関数を作りたかったのだが、うまくいかず、苦肉の策としてこんな感じで実装した
export type User = {
id:number,
name:string
}
export function useGetName(user:User|Ref<User|undefined):string
{
if('constructor' in user && 'value' in user){
if(user.value && user.value.name){
return user.value.name;
}
}
if('name' in user){
return user.name ;
}
return '';
}
Ref型だとconstructor だの value だのがあるので in で両方あるかどうか調べて、あったらRef型として処理する様にしました。
すごくいけてない気がする・・・。