可鏈接的方法
當您正在使用的,而不是一個函數的類,你可以使用this
類型來表達事實的方法返回它在(鏈接方法)上調用的實例。
沒有this
:
class StatusLogger {
log(message: string): StatusLogger { ... }
}
// this works
new ErrorLogger().log('oh no!').log('something broke!').log(':-(');
class PrettyLogger extends StatusLogger {
color(color: string): PrettyLogger { ... }
}
// this works
new PrettyLogger().color('green').log('status: ').log('ok');
// this does not!
new PrettyLogger().log('status: ').color('red').log('failed');
隨着this
:
class StatusLogger {
log(message: string): this { ... }
}
class PrettyLogger extends StatusLogger {
color(color: string): this { ... }
}
// this works now!
new PrettyLogger().log('status:').color('green').log('works').log('yay');
可鏈接的功能
當一個函數是可鏈接的,你可以用一個接口類型是:
function say(text: string): ChainableType { ... }
interface ChainableType {
(text: string): ChainableType;
}
say('Hello')('World');
與屬性/方法可鏈接的功能
如果一個函數具有其他屬性或方法(如jQuery(str)
VS jQuery.data(el)
),您可以鍵入函數本身作爲接口:
interface SayWithVolume {
(message: string): this;
loud(): this;
quiet(): this;
}
const say: SayWithVolume = ((message: string) => { ... }) as SayWithVolume;
say.loud =() => { ... };
say.quiet =() => { ... };
say('hello').quiet()('can you hear me?').loud()('hello from the other side');
能否請您解釋爲何它必須有一個名字? –
@OldrichSvec除非有一些特殊的自引用類型關鍵字,否則您需要一個名稱才能引用它,而IMO經常不會使用這個關鍵字來增加值。 –
@OldrichSvec彼得是完全正確的。遞歸類型需要能夠引用自身。給它一個名字可以讓它引用它自己。 – chuckj