async function sub<T extends string | string[] = string>(
uid: T,
): Promise<T extends string ? number : boolean> {
if (Array.isArray(uid)) {
// Type 'true' is not assignable to type 'T extends string ? number : boolean'.
return true;
}
// Type '1' is not assignable to type 'T extends string ? number : boolean'.
return 1;
}
据我所知,这是打字稿的架构限制。对我个人而言,这不合逻辑,但我们拥有我们所拥有的。
看看下面的例子。它们比您遇到的更简单,但它们有同样的问题。
在 test1 函数中,变量 val 缩小为 T&string。但是返回值的类型不仅仅是字符串或布尔值,它还依赖于 T。在这种情况下,编译器必须处理所有可能的返回并将它们组合成一个团队,然后将它们与中指定的类型进行比较功能说明。只有这样编译器才能正确检查返回类型。
类型检查器目前根本不处理这种情况。
这里还有两个直接返回所需值的示例,但编译器对它们发誓:
此外,您可以在 git 上看到这两张票。它们都带有设计限制标记。而且这种不合逻辑的行为似乎将永远存在。
https://github.com/microsoft/TypeScript/issues/22735
https://github.com/microsoft/TypeScript/issues/24929
在这些票据中,打字稿开发人员建议使用 as 明确指定类型。