如何告诉 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
运算符,但这是作弊。
我有错误: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
运算符,但这是作弊。