
foo 类型表示一个函数,它既可以返回 promise<string>,也可以返回 promise<any>。这等价于以下函数重载声明:
function foo(): Promise<string>; function foo(): Promise<any>;
当调用一个重载函数时,Typescript 编译器会尝试找到“最合适”的签名来匹配调用。通常,它会选择列表中第一个匹配的签名。
例如:
function foo(x: string): number;
function foo(x: number): string;
function foo(x: string | number) {
return typeof x === "string" ? x.length : x.toFixed(1)
}
const n = foo("abc"); // resolves to first call signature
// const n: number
const s = foo(123); // resolves to second call signature
// const s: string在上面的例子中,foo("abc") 调用会匹配第一个签名,因此 n 的类型被推断为 number。foo(123) 调用会匹配第二个签名,因此 s 的类型被推断为 string。
当尝试从重载函数类型中进行类型推断时,Typescript 编译器通常只会从最后一个签名进行推断。这在某些情况下可能会导致意外的结果。
例如:
type FooRet = ReturnType<typeof foo> // type FooRet = string // ^^^^^^^^^^^^^^^^^^^^ not (string & number) or [string, number]
ReturnType<typeof foo> 会推断出 string 类型,而不是 string & number 或 [string, number]。这是 Typescript 的一个设计限制,在 microsoft/TypeScript#43301 中有所提及。
解决函数交集类型与推断类型不匹配问题的最佳方法是避免不必要的函数重载。如果不同的签名实际上返回的是同一类型,或者可以合并成一个更通用的类型,则应该避免使用重载。
例如,如果想要函数返回 { a: string } 和 { b: number } 的交集类型,正确的做法是:
function baz(): { a: string } & { b: number } {
return { a: "", b: 1 }
}
const ab = baz();
// const ab: { a: string; } & { b: number; }
type BazRet = ReturnType<typeof baz>;
// type BazRet: { a: string; } & { b: number; }而不是使用多个函数签名:
function bar(): { a: string };
function bar(): { b: number };
function bar() {
return { a: "", b: 1 }
}回到原始问题中的例子:
type Foo = (() => Promise<string>) & (() => Promise<any>) ;
这个类型表示一个函数,它可以返回 Promise<string> 或 Promise<any>。然而,使用 any 类型通常是不推荐的,因为它会失去类型安全性。
更合适的做法是根据实际需求选择更具体的类型。如果该函数总是返回 Promise<string>,则应该使用 () => Promise<string>。如果需要处理更广泛的类型,可以考虑使用泛型或更具体的联合类型。
例如,如果该函数可能返回字符串或数字,则可以使用以下类型:
type Foo = () => Promise<string | number>;
函数类型交集在 Typescript 中可以模拟函数重载,但在类型推断方面存在局限性。为了避免类型不匹配的问题,应该尽量避免不必要的函数重载,并选择更具体、更通用的类型来描述函数的行为。在使用 any 类型时要格外小心,因为它会降低代码的类型安全性。理解 Typescript 的类型系统,并遵循最佳实践,可以编写出更健壮、更可维护的代码。
以上就是Typescript 函数交集类型与推断类型不匹配问题详解的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号