TypeScript 对象属性判断

一个函数接收一个参数 param,它是如下类型:

type IObj =
  | undefined
  | {}
  | {
      user: {};
    }
  | {
      user: {
        name: string;
      };
    };

现在,这个函数的功能是返回 param.user.name,如果 param.user.name 不是 string, 直接返回一个默认字符串 'Tom'。请问在 TypeScript 如何实现这个函数?

阅读 4.7k
1 个回答

你这个 Param 定义的就有问题,除了代码按字数算工钱我想不到为什么要这么写。

正常的应该写为:

type IObj = {
  user?: {
    name?: string;
  };
}

这样就表示各个字段是可能为空的了,函数实现则是:

function fn(obj?: IObj) {
  // 其实我没懂为啥你要判断是否是字符串……
  return (typeof obj?.user?.name === 'string') ? obj.user.name : 'Tom';
  // 这样其实就够了:
  // return obj?.user?.name ?? 'Tom';
}

如果非要按你现在这坨类型声明去写的话,那么是:

function fn(obj: IObj) {
  if (obj && ('user' in obj) && ('name' in obj.user) && (typeof obj.user.name === 'string')) {
    return obj.user.name;
  }
  return 'Tom';
} 
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进