Es gibt einige Stellen in der Closure-Bibliothek, in denen Schnittstellen ein addImplementation/isImplementedBy
Paar von Funktionen haben, um eine Laufzeitprüfung an der Schnittstelle durchzuführen (ähnlich wie this answer). Ich bin nicht ganz ein Fan dieser Lösung, wo ich etwas sehr einfaches habe. Gibt es eine Möglichkeit, Ententipp mit aktivierten ADVANCED_OPTIMIZATIONS zu tun? Sagen, ich habe eine Schnittstelle, und eine Komponente, die auf Kinder mit dieser Schnittstelle, z.B .:Erkennen von Schnittstellen und Eingabe von Enten Closure
/** @interface */
MyInterface = function() {};
MyInterface.prototype.doSomething = function() {};
/**
* @constructor
* @extends {goog.ui.Component}
*/
MyComponent = function() {
...
};
/** @inheritDoc */
MyComponent.prototype.addChild = function(child, opt_render) {
goog.base(this, 'addChild', child, opt_render);
if (child.doSomething) {
child.doSomething();
}
};
Will ADVANCED_OPTIMIZATIONS konsequent umbenennen, dass „doSomething“ Eigenschaft mit den Implementierungen besondere Aktion nimmt? Wenn nicht, wird das Hinzufügen einer Typ-Union sicherstellen, dass es geht? z.B.
/**
* @param {goog.ui.Component|MyInterface} child
*/
MyComponent.prototype.addChild = function(child, opt_render) {
if (child.doSomething) {
child.doSomething();
}
};
Danke, ich wusste nicht über @ Record, es sieht in der Regel sehr nützlich. Im Falle der Typeinschränkung, die ich hier mache, bin ich mir nicht sicher, ob es etwas hinzufügt - ich möchte immer noch nach einer impliziten Schnittstelle suchen. Ich erkannte nach dem ersten Post, dass ich die Variable einfach auf die Schnittstelle tippen und dann nach der Eigenschaft suchen kann - funktioniert das nur mit '@ record' oder wird es immer noch mit' @ interface' funktionieren? – flatline
Ein Objekt wird nicht mit einer Schnittstelle übereinstimmen, ohne dass eine explizite Anmerkung "@ implements" vorhanden ist. Es passt einen Datensatz einfach durch eine passende Signatur an. Sie werden weiterhin Ihren Union-Typ benötigen, um der 'addChild'-Methode mitzuteilen, dass die Schnittstelle übergeben werden kann. –