自定义类型字符串,带验证“EmailAddress”

时间:2017-04-22 05:05:59

标签: javascript validation typescript

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

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))

当然如果我这样做:

let email = new EmailAddress('')

然后我收到错误。

4 个答案:

答案 0 :(得分:-1)

我们试试这个:

http://example.com/example.com.image_1.zip [500Mb]  
http://example.com/example.com.image_2.zip [500Mb]  
http://example.com/example.com.image_3.zip [500Mb]  
http://example.com/example.com.image_4.zip [227Mb]

答案 1 :(得分:-1)

试试这个

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

答案 2 :(得分:-1)

如果我理解正确,那么当参数不是电子邮件地址类型而不是来自exampleTakesEmail ctor时,您希望从EmailAddress抛出某种错误。

我认为在将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))

jsfiddle链接:https://jsfiddle.net/sayan751/rpbt0xjo/

其他资源: 来自TypeScript FAQ

  

在编译期间会删除TypeScript类型(https://en.wikipedia.org/wiki/Type_erasure)。这意味着没有用于执行运行时类型检查的内置机制。由您决定如何区分对象。

答案 3 :(得分:-1)

这符合预期,flow types是打字稿的替代品!

流程中的以下内容不会抛出:

/* @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 */

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))