EcmascriptのFirst class protocolの提案について
proposal-first-class-protocol
View Slide
せ: @brn (ꫬꅿ⨳ⵃa.k.a ـٕ٦ظ)耵噟: ؿٗٝزؒٝسؒٝآص،٥iOSؒٝآص،⠓爡: Cyberagent ،سذؙأةآؔRightSegment٥AI Messengerـؚٗ: http://abcdef.gets.b6n.ch/Twitter: https://twitter.com/brn227GitHub: https://github.com/brn
What is this proposal ?protocolך䲿周⯋ղכinterfaceך䲿周կ
What is 'protocol' ?classָ㹋鄲ׅץֹ鋉秈邌ׅկ㹋䡾כקהוinterfaceהずׄדծswiftװobjective-cדכinterfaceprotocolהㄎןծjavaדכず瘝ךךinterfaceהㄎע(稢ְַ鎉铂➬圫♳ך麩ְכָ֮)
Ecmascript way׃ַ׃Ecmascriptךprotocolכֿך⚕倯ה殯ז杝荈ך➬圫ָ䲿周ׁגְկ
As Symbol植㖈䲿周⚥ךֿךproposalכprotocolծًاحس䭯אSymbolך꧊さה׃ג邌ׅկ
protocol ProtocolName {!// 実装が必要なシンボルを宣言thisMustBeImplemented;!!// メソッド実装youGetThisMethodForFree() {!return this[ProtocolName.thisMustBeImplemented]();!}!}!!class ClassName implements ProtocolName {![ProtocolName.thisMustBeImplemented]() {!...!}!} !
Extends Existing class傀㶷ךclassח㼎׃גprotocol㹋鄲ֿׅהָדֹկ
protocol Functor {!map;!}!!Promise.prototype[Functor.map] = () => {!...!}!!Protocol.implement(Promise, Functor);!
'implements' keyword倜חimplements怴皾㶨ָ鷄⸇ׁ
Promise implements Functor // true!!if (MyClass implements SomeProtocol) { }!
Extends protocolprotocolכ➭ךprotocol䭁䓸דֹ
protocol A { a; }!protocol B extends A { b; }!!class C implements B {![A.a]() {}![B.b]() {}!}!!class D implements A {![A.a]() {}!}!
DefaultImplementationⴱ劍㹋鄲鷄⸇דֹ
protocol A { a; }!!protocol B extends A {![A.a]() { ... }!}!
Static protocol涸ًاحسprotocolדⵖ䖴ֿׅהָ〳腉
protocol A {!static b() {}!}!!class C implements A { }!C[A.b]();!
Issues傀㶷ךؙٓأ䭁䓸ׅ㜥さծprototypeפך湫䱸➿Ⰵהְֲ䲿周ָ遤גְկְֻזד儗➿鹼זךדծ➿剏周䲿周׃גְֶկ
Proposed 1Protocol.impelemtꟼ侧ך痥♲䒷侧ד㹋鄲
protocol Functor {!map;!}!!// If implementation is not satisfied,throw TypeError.!Protocol.implement(Array, Functor, {![Functor.map]: Array.prototype.map!});!
Proposed 2傀㶷ךؙٓأⱄ䏝implementsؗ٦ٙ٦سד䭁䓸〳腉ח
protocol Functor {!map;!}!!// We can implements protocol afterdeclaration.!Array implements Functor {![Functor.map]: Array.prototype.map!}!
TypeScript?הִ֮׆ծ傀㶷ךinterfaceכ婍ׅדֲ֮הךֿהկprotocolוך״ֲז㘗ה׃ג䪔ֲַכ劢㹀Allow dynamic name in typesהְֲ㘗ךفٗػذ؍せחsymbol⢪ֲֿהָדֹPRָ鹌דְךדծָֿ㹋鄲ׁהprotocolأي٦ؤחְַֽկ
׀幠耮ָ֮הֲ׀ְׂת׃