如何解决基于TypeScript中字符串内容的重载函数
说我有一个接受input
字符串参数的函数。如果input
以"!"
字符开头,则该函数应返回boolean
类型。如果input
以"?"
字符开头,则该函数应返回string[]
类型。
问题是,是否有可能在TypeScript定义文件中记录此类行为的重载?
解决方法
这是不可能的。
打字稿中的字符串可以是常量文字字符串,例如:
const a = "A"
或者它可能是string
类型,这意味着它可能具有任何内容,例如:
const str = prompt("What is your name?")`
无法定义与任何类型的模式匹配的字符串类型。
我不知道您要做什么,但是这里可能有更好的方法来设计API。
如果您确实了解所有可能性,则可以将它们视为常量字符串。
type Bang = "!A" | "!B" | "!C"
type Question = "?A" | "?B" | "?C"
function doStuff(str: Bang): boolean
function doStuff(str: Question): string[]
function doStuff(str: Bang | Question): boolean | string[] {
if (str.startsWith("!")) {
return true
} else {
return ['strings','here']
}
}
doStuff('!A') // boolean
doStuff('?A') // string[]
更新Typescript 4.1:
Typescript 4.1(仅在2020年9月18日以beta版本发布)包括对Template Literal Types的支持。这使您可以强类型化字符串文字的内容。现在,您可以取出一部分字符串文字,并单独使用它们。
有了此功能,您的问题可以像这样解决:
// Typescript 4.1
function doStuff<
Prefix extends '!',Suffix extends string
>(str: `${Prefix}${Suffix}`): boolean
function doStuff<
Prefix extends '?',Suffix extends string
>(str: `${Prefix}${Suffix}`): string[]
function doStuff<
Prefix extends '!' | '?',Suffix extends string
>(str: `${Prefix}${Suffix}`): boolean | string[] {
if (str.startsWith("!")) {
return true
} else {
return ['strings','here']
}
}
doStuff('!A') // boolean
doStuff('?A') // string[]
doStuff('bad format') // type error
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。