【发布时间】:2021-06-02 15:36:15
【问题描述】:
我有一个函数,它接受第二个参数,当第一个参数是与模板文字字符串匹配的字符串时,仅需要。然而,似乎即使 TypeScript 知道第一个参数是这样一个字符串,它仍然匹配采用常规字符串的重载:
type KnownString = `known${string}`;
type AnyString = string;
function doSomethingWithString(arg1: KnownString, onlyRequiredForKnownString: boolean): string;
function doSomethingWithString(arg1: AnyString, onlyRequiredForKnownString?: boolean): string;
function doSomethingWithString(arg1: KnownString | AnyString, onlyRequiredForKnownString?: boolean): string {
return "The second argument is only required when `arg1` is a KnownString";
}
const thisIsAKnownString = "knownstring" as KnownString;
// @ts-expect-error Since TS knows that arg1 is a KnownString, it should require the second parameter:
doSomethingWithString(thisIsAKnownString);
这当然是有道理的,因为它是一个常规字符串。有没有办法告诉重载匹配任何常规字符串 except KnownString?
(我 did try with a conditional type 喜欢 this similar question 中的建议,但这似乎不适用于模板文字字符串。)
【问题讨论】:
-
您的函数难道不能通过第二个重载接收“已知”字符串吗?我的意思不是在编译时,我的意思是在运行时,当省略第二个参数时,函数仍然必须能够处理这样的字符串。在这种情况下它会抛出错误吗?
-
@kaya3 是的,在我的实际代码中,还有一个运行时检查,以防不使用 TypeScript 的开发人员调用它,但我希望 TypeScript 开发人员在没有潜在错误的情况下得到通知必须在正在运行的应用程序中触发此代码路径。
标签: typescript