Javascript 带有验证的自定义类型字符串;电邮地址;

Javascript 带有验证的自定义类型字符串;电邮地址;,javascript,validation,typescript,Javascript,Validation,Typescript,下面我有一些打字脚本代码。我的目的是为电子邮件地址创建一个新的自定义类型,一个带有特定验证的字符串。我想要一种确保字符串参数已经被验证为特定类型的方法。下面的代码不会像我预期的那样抛出任何验证错误 class EmailAddress { constructor (emailAddress) { var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(&q

下面我有一些打字脚本代码。我的目的是为电子邮件地址创建一个新的自定义类型,一个带有特定验证的
字符串。我想要一种确保字符串参数已经被验证为特定类型的方法。下面的代码不会像我预期的那样抛出任何验证错误

class EmailAddress {
    constructor (emailAddress) {
        var re = /^(([^<>()\[\]\\.,;:\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 (!re.test(emailAddress)) throw new Error('invalid email address')
    }
}

function exampleTakesEmail (email: EmailAddress) {
    return {
        email
    }
}

let email = new EmailAddress('example@gmail.com')
let notEmail = ''

console.log(exampleTakesEmail(email))
console.log(exampleTakesEmail(notEmail))
然后我确实得到了一个错误。

让我们试试这个:

class EmailAddress {
    constructor (emailAddress) {
        var re = /^(([^<>()\[\]\\.,;:\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 (!re.test(emailAddress)) throw new Error('invalid email address')
    }
}

function exampleTakesEmail (email: EmailAddress) {
    return {
        email
    }
}

let email = new EmailAddress('example@gmail.com')
let notEmail = new EmailAddress('') //construct an empty string EmailAddress first

console.log(exampleTakesEmail(email))
console.log(exampleTakesEmail(notEmail))
类电子邮件地址{
构造函数(电子邮件地址){
变量re=/^([^()\[\]\\,;:\s@“]+(\.[^()\[\]\,;:\s@“]+)*)(“+”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[1,3}.[0-9]{1,3}.]124;([a-zA Z-0-9]+]$/
如果(!re.test(emailAddress))抛出新错误('无效的电子邮件地址')
}
}
函数示例TakeSeMail(电子邮件:EmailAddress){
返回{
电子邮件
}
}
let email=新电子邮件地址('example@gmail.com')
让notEmail=newemailaddress(“”)//首先构造一个空字符串EmailAddress
console.log(例如takesemail(电子邮件))
log(例如takesemail(notEmail))
试试这个

function exampleTakesEmail (email: EmailAddress | string) {
    return typeof email==="string" ? 
            new EmailAddress(email) : email;
}

如果我理解正确,那么当参数不是email address类型且不是来自
EmailAddress
时,您希望从
示例takesemail
抛出某种错误

我认为在将TypeScript编译成JavaScript之后,类型信息不会像您期望的那样被保留。因此,如果您想进行类型检查,您可能会考虑使用
instanceof
运算符,它看起来像这样:

class EmailAddress {
    constructor (emailAddress) {
        var re = /^(([^<>()\[\]\\.,;:\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 (!re.test(emailAddress)) throw new Error('invalid email address');

    }
}

function exampleTakesEmail (email: EmailAddress) {
    if(!(email instanceof EmailAddress)) throw new Error("Not email")
    return {
        email
    }    
}

let email = new EmailAddress('example@gmail.com')
let notEmail = ''//new EmailAddress('abc')

console.log(exampleTakesEmail(email))
console.log(exampleTakesEmail(notEmail))
类电子邮件地址{
构造函数(电子邮件地址){
变量re=/^([^()\[\]\\,;:\s@“]+(\.[^()\[\]\,;:\s@“]+)*)(“+”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[1,3}.[0-9]{1,3}.]124;([a-zA Z-0-9]+]$/
如果(!re.test(emailAddress))抛出新错误(“无效的电子邮件地址”);
}
}
函数示例TakeSeMail(电子邮件:EmailAddress){
如果(!(EmailAddress的电子邮件实例))抛出新错误(“非电子邮件”)
返回{
电子邮件
}    
}
let email=新电子邮件地址('example@gmail.com')
let notEmail=''//new EmailAddress('abc'))
console.log(例如takesemail(电子邮件))
log(例如takesemail(notEmail))
JSIDLE链接:


其他资源: 发件人:

TypeScript类型在编译期间被擦除()。这意味着没有用于执行运行时类型检查的内置机制。由您决定如何区分对象


这与typescript的替代品一样有效

流中的以下项不会抛出:

/* @flow */

class EmailAddress {
    constructor (emailAddress) {
        var re = /^(([^<>()\[\]\\.,;:\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 (!re.test(emailAddress)) throw new Error('invalid email address')
    }
}

function exampleTakesEmail (email: EmailAddress) {
    return {
        email
    }
}

let email = new EmailAddress('example@gmail.com')
let notEmail = ''

console.log(exampleTakesEmail(email))
/*@flow*/
类电子邮件地址{
构造函数(电子邮件地址){
变量re=/^([^()\[\]\\,;:\s@“]+(\.[^()\[\]\,;:\s@“]+)*)(“+”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[1,3}.[0-9]{1,3}.]124;([a-zA Z-0-9]+]$/
如果(!re.test(emailAddress))抛出新错误('无效的电子邮件地址')
}
}
函数示例TakeSeMail(电子邮件:EmailAddress){
返回{
电子邮件
}
}
let email=新电子邮件地址('example@gmail.com')
让notEmail=''
console.log(例如takesemail(电子邮件))
正如我所预料的那样,这会造成什么后果:

/* @flow */

class EmailAddress {
    constructor (emailAddress) {
        var re = /^(([^<>()\[\]\\.,;:\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 (!re.test(emailAddress)) throw new Error('invalid email address')
    }
}

function exampleTakesEmail (email: EmailAddress) {
    return {
        email
    }
}

let email = new EmailAddress('example@gmail.com')
let notEmail = ''

console.log(exampleTakesEmail(notEmail))
/*@flow*/
类电子邮件地址{
构造函数(电子邮件地址){
变量re=/^([^()\[\]\\,;:\s@“]+(\.[^()\[\]\,;:\s@“]+)*)(“+”)(\[[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[1,3}.[0-9]{1,3}.]124;([a-zA Z-0-9]+]$/
如果(!re.test(emailAddress))抛出新错误('无效的电子邮件地址')
}
}
函数示例TakeSeMail(电子邮件:EmailAddress){
返回{
电子邮件
}
}
let email=新电子邮件地址('example@gmail.com')
让notEmail=''
log(例如takesemail(notEmail))


您的意思是这不会引发任何错误或警告
console.log(例如takesemail(notEmail))
。我写的是js,但不是typescript,但我希望在函数需要
EmailAddress
对象的地方传递一个字符串会引发某种错误或警告,我正在编译、运行并得到它<代码>{email:EmailAddress{}}\n{email:'}
不确定我是否正确运行。我正在运行
tsc example.ts
,然后运行
node example.js
。我认为您的第二个电子邮件地址应该是
新电子邮件地址(“”)
,而不仅仅是一个空字符串,还只是使用
ts node
运行了它,并且运行时没有错误。感谢您的帮助、时间和精力!但这不是我要找的。我特别寻找最后一行抛出错误的功能。你确定没有打开错误报告的地方吗?我看到了:也许它会导致编译失败@我认为,这应该确保传递到函数中的参数都是非类型的。感谢您的贡献!我觉得这完全违背了使用类型脚本的目的。我正在寻找一种不必检查函数中参数类型的解决方案,但实际上您提供的是一个字符串,而不是EmailAddress的实例。据我所知,没有强类型语言会接受这一点。所以我们在这里所做的就是检测它,并将其转换为真正的EmailAddress实例。我认为这正是他正试图用typescript证明的要点。它实现了严格输入的承诺吗?@Val检查我的答案显然流类型做到了这一点,所以有一个接受它。嘿!谢谢你!这与@Val给出的解决方案非常相似。从函数内部验证参数的一种方法。但我真的期待typescript为我处理这种验证。非常感谢!你没有回答这个问题@thomasreggi需要“抛出空字符串的电子邮件验证错误”,但您给出了“编译时错误”的答案,这不符合主题。@thomasreggi您的目标“我一直在试图找到流类型和类型脚本之间的主要区别…”似乎与发布的问题不同。你不认为还需要另外一个问题来明确说明吗?@Val这个答案说明了fl是如何做到的
/* @flow */

class EmailAddress {
    constructor (emailAddress) {
        var re = /^(([^<>()\[\]\\.,;:\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 (!re.test(emailAddress)) throw new Error('invalid email address')
    }
}

function exampleTakesEmail (email: EmailAddress) {
    return {
        email
    }
}

let email = new EmailAddress('example@gmail.com')
let notEmail = ''

console.log(exampleTakesEmail(notEmail))