1

使用惯用的 js 在错误时返回未定义,转换为 TS

function multiply(foo: number | undefined){
   if (typeof foo !== "number"){
      return;
   };
   return 5 * foo;
}

在新的 TS 代码中使用乘法时,我遇到了编译器认为 doStuff 可以返回未定义的问题,而实际上它不能。

因此,我尝试编写由安全 TS 代码调用的该函数的“不安全”版本,而将安全版本留给常规 js 代码。

function unsafeMultiply(num: number){
   return multiply(num);
}

由于 unsafeMultiply 只能接受一个数字,因此 multiply 中的类型保护应该考虑到 multiply 只会返回一个数字,因为 unsafeMultiply 只能处理数字。如果这对编译器来说太复杂了,我该如何强迫他接受我知道我在做什么?

4

1 回答 1

2

在新的 TS 代码中使用乘法时,我遇到了编译器认为 doStuff 可以返回未定义的问题,而实际上它不能。

是的,它可以:multiply(undefined)返回undefined

如果这对编译器来说太复杂了,我该如何强迫他接受我知道我在做什么?

You can do a type assertion, since you know that multiply will only return undefined if it is called with a non-number:

function unsafeMultiply(num: number) {
   return multiply(num) as number;
}

Or you can add code for a type guard at runtime:

function unsafeMultiply(num: number) {
  let result = multiply(num);
  if (typeof result === "undefined") {
    throw new Error("Invalid num argument");
  }
  return result;
}

But if it were me, I'd make the multiply function fail or return NaN rather than returning undefined, if given undefined. Then unsafeMultiply wouldn't be needed.

于 2020-01-12T18:53:55.607 回答