[typescript]変数の型が何か調べたい時

typescript

プリミティブ型なのかオブジェクトなのか調べたい時は 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型として処理する様にしました。
すごくいけてない気がする・・・。

タイトルとURLをコピーしました