String 基于TypeScript中字符串内容的重载函数
假设我有一个函数,它接受String 基于TypeScript中字符串内容的重载函数,string,typescript,function,overloading,String,Typescript,Function,Overloading,假设我有一个函数,它接受输入字符串参数。如果input以“!”字符开头,则函数应返回布尔类型。如果input以“?”字符开头,则函数应返回字符串[]类型 问题是,是否可以在TypeScript定义文件中记录此类行为的重载?这是不可能的 typescript中的字符串可以是常量文字字符串,例如: const a = "A" const str = prompt("What is your name?")` 或者它可能是string类型,这意味着它可能有任
输入
字符串参数。如果input
以“!”
字符开头,则函数应返回布尔类型。如果input
以“?”
字符开头,则函数应返回字符串[]
类型
问题是,是否可以在TypeScript定义文件中记录此类行为的重载?这是不可能的
typescript中的字符串可以是常量文字字符串,例如:
const a = "A"
const str = prompt("What is your name?")`
或者它可能是string
类型,这意味着它可能有任何内容,例如:
const a = "A"
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版中发布)包括对的支持。这使您可以将字符串文本的内容设置为强类型。现在,您可以提取部分字符串文字并单独使用它们
使用此功能,您的问题可以这样解决:
// 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
//类型脚本4.1
函数doStuff<
前缀扩展了“!”,
后缀扩展字符串
>(str:`${Prefix}${Suffix}`):布尔值
函数doStuff<
前缀扩展了“?”,
后缀扩展字符串
>(str:`${Prefix}${Suffix}`):string[]
函数doStuff<
前缀扩展了“!”|“?”,
后缀扩展字符串
>(str:`${Prefix}${Suffix}`):布尔|字符串[]{
if(str.startsWith(“!”){
返回真值
}否则{
return['strings','here']
}
}
doStuff(“!A”)//布尔值
doStuff('?A')//string[]
doStuff('bad format')//类型错误
否;这是价值问题,不是类型问题。如果您知道可以使用的完整值集,但我认为您不能为前缀这样做。我添加了一个使用常量字符串的示例,如果您知道所有可能的值,字符串可能会提前。也许这将有助于节省一些时间:)我不知道您的数据集是什么样子,但是,如果您可以像{id:string,type:'entity'|'item'}
那样键入数据结构,而不是依赖特定的标识符格式,这将很容易。但这可能对你没有帮助:)我可以更新我的实现,不再需要前缀的东西,但我真的很感激你刚才给出了一个直截了当的答案,你是这个网站上的稀有品种。HarrisonSmith Typescript 4.1刚刚在beta版中发布,它有一个功能,可以满足您最初的需求。万一这对你来说仍然是个问题,请参阅我的更新。