下面我有一些打字稿代码。我的意图是为电子邮件地址创建一个新的自定义类型,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('')
然后我收到错误。
答案 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))