gpt4 book ai didi

javascript - typescript 可以推断出一个参数已经过验证吗?

转载 作者:行者123 更新时间:2023-12-04 10:51:01 26 4
gpt4 key购买 nike

我还在学习 Typescript 和 Javascript,所以如果我遗漏了什么,请原谅。
问题如下:
当前,如果在调用 时未定义电子邮件,VSCode 不会推断我抛出错误。 this.defined(电子邮件) .这是因为 validateEmail() 接受一个字符串?并且不会编译,因为它认为它仍然可以收到一个未定义的值(至少是我的推论)。有没有办法告诉编译器这没问题?或者我错过了什么?
我想从其他类调用 Validate.validateEmail() 并且这些类中也会出现问题。
验证.ts

export default class Validate {
static validateEmail(email?: string) {
// TODO: Test this regex properly.
const emailRegex = new RegExp('^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$')

this.defined(email);
this.notEmpty(email);

if (!emailRegex.test(email)) {
throw new SyntaxError("The email entered is not valid");
}
}

static defined(text?: string) {
if (!text) {
throw new SyntaxError("The text recieved was not defined.");
}
}

static notEmpty(text: string) {
if (text.length < 1) {
throw new SyntaxError("The text entered is empty.");
}
}
}

最佳答案

您可以使用 type guard .类型保护声明特定变量的类型,如下所示:

export default class Validate {
public static validateEmail(email?: string) {
const emailRegex = new RegExp(
'^(([^<>()[]\\.,;:s@"]+(.[^<>()[]\\.,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$'
);

if (!Validate.defined(email)) {
throw new SyntaxError('The text recieved was not defined.');
}

if (!emailRegex.test(email)) {
throw new SyntaxError('The email entered is not valid');
}
}

public static defined(text?: string): text is string {
return !!text;
}

public static notEmpty(text: string) {
if (text.length < 1) {
throw new SyntaxError('The text entered is empty.');
}
}
}

缺点是你仍然需要一个 if 语句并且 throw 表达式在函数之外。

或者你可以做这样的事情,避免这些问题,但需要你重新分配 email到函数的结果。
export default class Validate {
public static validateEmail(email?: string) {
const emailRegex = new RegExp(
'^(([^<>()[]\\.,;:s@"]+(.[^<>()[]\\.,;:s@"]+)*)|(".+"))@(([[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}])|(([a-zA-Z-0-9]+.)+[a-zA-Z]{2,}))$'
);

email = Validate.defined(email);

if (!emailRegex.test(email)) {
throw new SyntaxError('The email entered is not valid');
}
}

public static defined(text?: string): string {
if (!text) {
throw new SyntaxError('The text recieved was not defined.');
}
return text;
}

public static notEmpty(text: string) {
if (text.length < 1) {
throw new SyntaxError('The text entered is empty.');
}
}
}

关于javascript - typescript 可以推断出一个参数已经过验证吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59474967/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com