在 TypeScript 中使用重载或可选参数有什么区别吗?

Sor*_*oot 3 typescript

我想知道以下代码块是否有任何区别?第一个创建 readText 函数的 2 个定义。我会用第二种方式编写它,并带有一个可选参数。

readText(fileName: string, def: string): WinJS.Promise;
readText(fileName: string): WinJS.Promise;
Run Code Online (Sandbox Code Playgroud)

readText(fileName: string, def?: string): WinJS.Promise;
Run Code Online (Sandbox Code Playgroud)

有什么理由不使用可选参数吗?

Rya*_*ugh 5

从类型兼容性的角度来看,这些在实践中是无法区分的。

但是,第二个版本稍微好一些,因为只有具有单个重载的函数才能应用上下文类型。例如:

interface Read1 {
    readText(fileName: string, def: string): any;
    readText(fileName: string): any;
}
// No contextual type applied because readText has multiple signatures
// 's' of type 'any', no error raised
var x: Read1 = { readText: (s) => s.subtring(s) };
Run Code Online (Sandbox Code Playgroud)
interface Read2 {
    readText(fileName: string, def?: string): any;
}
// Contextual type applied
// 's' of type 'string', error identified
var y: Read2 = { readText: (s) => s.subtring(s) };
Run Code Online (Sandbox Code Playgroud)