tl; dr:
Имя метода моего класса конфликтует с тем же именем в классе, из которого он расширяется.Я мог бы просто переименовать свой класс, но я бы предпочел решение, которое не требует серьезных изменений.
Фон
Я публикую библиотеку с именем lit-apollo
, который экспортирует class
, который простирается от LitElement
.Пользователи должны определять свои собственные customElements
с моим классом, эти элементы затем могут использовать apollo graphql для данных и визуализировать с использованием lit-html.См. README для простого примера.
Проблема
В последней версии LitElement представлен метод экземпляра, называемый update
, который реализации могут опционально переопределять, чтобы контролировать, как и когдаэлемент рендеринга. Моя библиотека также имеет свойство update
, которое соответствует опции update
конструкторов мутаций Apollo .
import gql from 'graphql-tag'
import { ApolloMutation, html } from 'lit-apollo/apollo-mutation'
const mutation = gql`
mutation($id: ID!) {
MyMutation(id: $id) {
myResponse
}
}
`
const updateFunc = (cache, response) =>
cache.writeData(doSomethingWith(cache, response))
class MutatingElement extends ApolloMutation {
constructor() {
this.mutation = mutation;
this.variables = {id: "foo"};
// here's where we break the LitElement contract
this.update = updateFunc;
}
render() {
return html`<div>${this.data.myResponse}</div>`
}
}
customElements.define('mutating-element', MutatingElement)
Эти два метода, несомненно, являютсяконфликтующий.
Вопрос
Я знаю, что мог бы просто внести решающее изменение в lit-apollo
, которое переименовывает его собственный update
метод в onUpdate
или что-то подобное, но как мне обратитьсяэта проблема, не нарушая API моих классов и, следовательно, требует основной версии?
Я хотя и проверил первый аргумент, чтобы увидеть, является ли он экземпляром ApolloCache, а затем перенаправил аргументы на super.update
по мере необходимости, но я думаю, что это нарушит контракт LitElement, не позволяя пользователям реализовать ихсобственная версия LitElement's update
Как бы вы справились с этой ситуацией?