Typescript,检查是否至少提供了一个

htzpubme  于 2023-06-24  发布在  TypeScript
关注(0)|答案(1)|浏览(168)

我有以下简单的功能

  1. function takeOneOfOrThrow(firstOptionalVariable : string | undefined, secondOptionalVariable : string | undefined) {
  2. let result : string;
  3. if ( !firstOptionalVariable && !secondOptionalVariable) {
  4. throw new Error('both are undefined');
  5. }
  6. result = firstOptionalVariable ? firstOptionalVariable : secondOptionalVariable;
  7. };

链接到Playground:https://tsplay.dev/mxJoxw
两个变量都是string或undefined。首先,if消除了两者都是未定义字符串或空字符串的情况。因此,其中一个肯定是长度> 0的字符串。那么为什么typescript给我错误有Type 'string | undefined' is not assignable to type 'string'.>什么是正确的方法来解决这个问题?

xpszyzbs

xpszyzbs1#

编译器无法根据您的条件推断类型。
条件检查两个变量是否都是undefined,但是即使其中一个不是,也无法推断出它们的正确类型,因为使它们都是string是没有意义的,因为这不是条件检查的。另外,编译器不能推断出其中只有一个是string,因为编译器直到运行时才知道哪一个不是空的。因此,当你试图赋值给变量时,变量之间没有关系,因此你得到了错误。
一个可能的解决方案是使用非空Assert操作符,正如另一个答案所建议的那样,但是,我建议避免使用它,因为如果函数体发生变化并且条件将被删除,编译器不会引发任何错误。
最简单的替代方法是,如果两个变量都为空,则使用默认值,假设由于以下条件而不会达到默认值:

  1. result = first ?? second ?? ''

或者,您可以使用if/else块:

  1. function takeOneOfOrThrow(firstOptionalVariable: string | undefined, secondOptionalVariable?: string | undefined) {
  2. let result: string;
  3. if (!firstOptionalVariable && !secondOptionalVariable) {
  4. throw new Error('both are undefined');
  5. }
  6. else if (firstOptionalVariable) {
  7. result = firstOptionalVariable;
  8. } else if (secondOptionalVariable) {
  9. result = secondOptionalVariable
  10. }
  11. };
展开查看全部

相关问题