Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 基于TypeScript中字符串内容的重载函数_String_Typescript_Function_Overloading - Fatal编程技术网

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版中发布,它有一个功能,可以满足您最初的需求。万一这对你来说仍然是个问题,请参阅我的更新。