【问题标题】:Use union type with wrapped object check使用带有包装对象检查的联合类型
【发布时间】:2019-04-03 17:45:29
【问题描述】:

我正在尝试将联合类型与简单的原语和一些自定义对象一起使用。例如,我在 Union Types 部分的 docs 中展示了示例联合类型,并添加了一个人为的 PaddingLeft 类型,如下所示:

type PaddingLeft = {
  aNumber: string,
}

function padLeft(value: string, padding: string | number | PaddingLeft) {
  if (typeof padding === "object") {
    return padding.aNumber + value;
  }
  if (typeof padding === "number") {
    return Array(padding + 1).join(" ") + value;
  }
  if (typeof padding === "string") {
      return padding + value;
  }
  throw new Error(`Expected string or number, got '${padding}'.`);
}

然后这样称呼它:

padLeft('1', 1);
padLeft('1', '2');
padLeft('1', {aNumber: '34'});

基于上面 padLeft 的实现,Typescript 很高兴。但是,我真的不想写:

if (typeof padding === "object") {

而是将检查提供的参数是否是函数内的对象包装起来,这样我就可以在简单的 typeof 检查之外进行其他检查。首先,我尝试编写一个与 typeof 检查功能相同的函数,但在函数内部:

function isObjectCheck (args: any) {
  return (typeof args === 'object');
}

然后我尝试将 typeof 检查替换为对 isObjectCheck 的调用(替换 padLeft 函数的第一行):

if (isObjectCheck(padding)) {

这样做会导致 Typescript 说:

类型“字符串”上不存在属性“aNumber” |号码 |左填充'。 类型“字符串”上不存在属性“aNumber”。

在 padLeft 函数的第二行。

如何将对象检查包装在一个函数中,同时满足 Typescript 的检查?

【问题讨论】:

    标签: typescript


    【解决方案1】:

    您正在寻找自定义类型保护。这将起作用:

    type PaddingLeft = {
        aNumber: string,
    }
    
    function isObjectCheck(args: any): args is object {
        return (typeof args === 'object');
    }
    
    function padLeft(value: string, padding: string | number | PaddingLeft) {
        if (isObjectCheck(padding)) {
            return padding.aNumber + value;
        }
        if (typeof padding === "number") {
            return Array(padding + 1).join(" ") + value;
        }
        if (typeof padding === "string") {
            return padding + value;
        }
        throw new Error(`Expected string or number, got '${padding}'.`);
    }
    

    【讨论】:

    • 很好,谢谢。看来我应该在文档中进一步向下滚动:)
    猜你喜欢
    • 2019-03-13
    • 1970-01-01
    • 2020-08-04
    • 2019-10-17
    • 2018-06-12
    • 2020-02-24
    • 1970-01-01
    • 2021-01-22
    • 2020-04-02
    相关资源
    最近更新 更多