【发布时间】:2021-06-22 21:25:32
【问题描述】:
我有一个函数,它采用日期格式字符串(例如,"YYYY-MM-DD" 或 "YYYY")并返回基于该格式的模板文字类型。下面的代码是一个最小的例子:
type ISODate = `${number}-${number}-${number}`;
type Year = `${number}`;
type ISOFormat = "YYYY-MM-DD";
type YearFormat = "YYYY";
function format(f: ISOFormat): ISODate;
function format(f: YearFormat): Year;
function format(f: ISOFormat | YearFormat) {
if (f === "YYYY-MM-DD") {
return "1234-12-12";
}
return "1234";
}
但是,我收到编译错误 (Typescript playground link):
此重载签名与其实现签名不兼容。
我发现真正奇怪的是,当我将任一返回值更改为模板文字时,编译错误就消失了。例如(Typescript playground link):
type ISODate = `${number}-${number}-${number}`;
type Year = `${number}`;
type ISOFormat = "YYYY-MM-DD";
type YearFormat = "YYYY";
function format(f: ISOFormat): ISODate;
function format(f: YearFormat): Year;
function format(f: ISOFormat | YearFormat) {
if (f === "YYYY-MM-DD") {
return "1234-12-12";
}
return `${1}234`;
}
谁能帮我理解为什么前一个例子有编译错误,而后者编译得很好?
【问题讨论】:
-
${number}${number}${number}${number}是怎么回事?这不是你的意思;${number}匹配数字的任何字符串表示形式,例如"2"或"1.23"。所以${number}${number}${number}${number}的意思是“数字的四个字符串表示形式的连接”,比如,呃"3.141.2399.99-3.5"。这不是你想要的,对吧? -
哦,是的,这是一个非常愚蠢的错误。我的意图是一个四位数的数字,但现在我意识到这显然不会强制执行四位数。 (我想它会强制执行不少于四位数......)
-
我倾向于关闭它;但是,我仍然对为什么会发生这种情况感兴趣。即使类型分别为
`${number}-${number}-${number}`和`${number}`,编译错误似乎仍然发生 -
是的,您可能希望保持打开状态,但也许将其更改为不存在此特定问题的 minimal reproducible example
-
因为您的
ISODate类型中有一个额外的}?
标签: typescript