phương pháp thể kết nối
Khi bạn đang sử dụng một lớp thay vì một chức năng, bạn có thể sử dụng các loại this
để diễn tả thực tế là một phương pháp trả về thể hiện nó được gọi trên (phương pháp chuỗi).
Without 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');
Với 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');
thể kết nối chức năng
Khi một chức năng là thể kết nối bạn có thể gõ nó với một giao diện:
function say(text: string): ChainableType { ... }
interface ChainableType {
(text: string): ChainableType;
}
say('Hello')('World');
chức năng thể kết nối với các thuộc tính/phương pháp
Nếu một hàm có tính chất hoặc các phương pháp (như jQuery(str)
vs jQuery.data(el)
), bạn có thể gõ các chức năng chính nó như là một giao diện khác:
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');
Nguồn
2017-05-01 06:44:24
Ông có thể xin hãy giải thích về việc tại sao nó phải có tên? –
@OldrichSvec Bạn cần một tên để có thể tham chiếu đến nó, trừ khi có một số từ khóa tự tham chiếu đặc biệt, mà IMO sẽ không được sử dụng thường xuyên đủ để có giá trị gia tăng. –
@OldrichSvec Peter chính xác. Loại đệ quy cần có khả năng tự tham chiếu. Đặt tên cho phép nó tự tham chiếu. – chuckj