如何告诉 TypeScript Array 中没有 undefined?

How to tell TypeScript there is no undefined in Array?

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

这是我的功能:

    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,
  };
};

超级class方法:

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

你能告诉我怎样才能摆脱这个错误吗?

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

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

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

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

您可以阅读更多相关内容here

据我了解,你有两个值:

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 运算符,但这是作弊。