【问题标题】:How to tell TypeScript there is no undefined in Array?如何告诉 TypeScript Array 中没有未定义?
【发布时间】:2020-11-26 09:40:36
【问题描述】:

我有错误:Type (string | undefined)[] is not assignable to type string |字符串[] |未定义,因为我的函数 this.errors 获取类型字符串 |字符串[] |不明确的。但在返回数组之前,我用 undefined 过滤了它。这意味着没有未定义的。该值可以是字符串或未定义。 setErrors 的定义返回错误数组。 这是我的错误:

这是我的功能:

    this.setErrors(() => {
      const errors = validators.map(val => val(this.inputValue));
      const filteredErrors = errors.filter(el => el);

      return filteredErrors && filteredErrors.length !== 0 ? filteredErrors : undefined;
    });

验证器:

const REGEXP_UPPERCASE = /[A-Z]/;
const REGEXP_LOWERCASE = /[a-z]/;
const REGEXP_ONE_DIGIT = /.*[0-9].*/;

export const newPasswordValidators = (args: { min: number; max: number }) => {
  const { min, max } = args;
  return {
    minMaxLength: (value?: string) => value && value.length < min || value.length > max ? 'Not valid length' : undefined,
    requiredToFill: (value?: string) => !value ? 'Required to fill.' : undefined,
    uppercaseLetter: (value?: string) => value && !REGEXP_UPPERCASE.test(value) ? 'Use at least one uppercase letter.' : undefined,
    lowercaseLetter: (value?: string) => value && !REGEXP_LOWERCASE.test(value) ? 'Use at least one lowercase letter.' : undefined,
    atLeastOneDigit: (value?: string) => value && !REGEXP_ONE_DIGIT.test(value) ? 'Use at least one digit.' : undefined,
  };
};

超类方法:

  public setErrors(errors: string | string[] | undefined | (() => (string | string[] | undefined))) {
    this._errors = errors;
  }

你能告诉我如何摆脱这个错误吗?

【问题讨论】:

  • 什么是validatorsthis.inputValue 是什么? this.setErrors的定义是什么?
  • 无法返回过滤错误 && 过滤错误.length !== 0 ?过滤错误:未定义;只是返回 filtersErrors.length !== 0 ?
  • @jocoders,还需要添加this.setErrorsvalidators的定义
  • 验证器检查字符串,setErrors来自超类

标签: javascript typescript function types undefined


【解决方案1】:

您是否听说过类型转换(确切地说,由于 JS 的动态特性,它更像是 TS 中的类型断言)?听起来这就是你需要的,有两种方法可以产生基本相同的结果:

const x: string[] = <string[]>strAndUndefinedArr;
const y: string[] = strAndUndefinedArr as string[];

这适用于任何地方,你也可以做类似的事情

functionCall(<string[]>arr); //or functionCall(arr as string[])

你可以阅读更多关于这个here

【讨论】:

  • 如果你要为这样一个常见的错误求助于这个,为什么要使用 TypeScript?谁知道你正在抑制的运行时错误?
【解决方案2】:

据我了解,您有两个价值观:

const foo: (string | undefined)[] | undefined = 'hello foo';
const bar: string | string[] | undefined = 'hello bar';

您可能已经注意到,变量 bar 可以是 string,而变量 foo 不能。 变量foo 可以是字符串数组,也可以是未定义的数组或完全未定义的数组。

更简单的例子:

const fn = (arg: string)=>arg;
const result = fn(undefined) // error;

您不能将undefined 传递给期望string 的函数

我认为您应该调整您的类型或允许您的值之一为string 类型; 请记住,您可以使用any 类型或as 运算符,但这是作弊。

【讨论】:

  • 但是我不这样做,因为我之前过滤了一个数组为undefined返回。数组中没有undefined
  • 您能在任何在线沙箱中分享您的代码的工作示例吗?弄清楚这里发生了什么会容易得多
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
  • 2020-03-18
  • 1970-01-01
  • 2019-03-27
  • 2021-01-30
  • 1970-01-01
相关资源
最近更新 更多