ts 中请问如何根据参数类型进行推断?

例如:

interface A {
  a: number
}

interface B {
  a: number
  b: string
}

const X = (x) => {
  // 操作。。。
  return x
}

参数 x 有可能是 A 或者 B。

如果传入了 A 类型,希望操作后检查到返回 x,如果带属性 b 即错误。
如果传入了 B 类型,希望操作后检查到返回 x,如果不带属性 b 即为错误。

希望返回 x 的类型,断言等于传入的类型。

阅读 6.4k
2 个回答

手写一个重载可以做到

interface A {
  a: number
}

interface B {
  a: number
  b: string
}

interface XX {
    (x: A): A;
    (x: B): B;
}

const X: XX = (x) => x;

我表示这个问题我没有看得太明白,你的意思是想问 ts 实现的原理吗?还是如何使用 ts 来达到你说的效果?

如果是前者,这个我就默默地退下了,水平不够。

如果是后者,可以这么来实现:

interface A {
  a: any
}

interface B {
  a: any
  b: any
}

function isB(arg: A | B): arg is B {
    return (<B>arg).b !== undefined;
}

function foo(arg: A | B) {
  if (isB(arg)) {
    // arg is B
    console.log(arg.a, arg.b)
  } else {
    // arg is A
    console.log(arg.a)
  }
}

如果我理解有误,就无视吧,大神轻喷

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进