Работа с конфликтами имен методов класса в JavaScript - PullRequest
0 голосов
/ 23 сентября 2018

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

Как бы вы справились с этой ситуацией?

1 Ответ

0 голосов
/ 23 сентября 2018

Я знаю, что мог бы просто внести критическое изменение в lit-apollo, но как мне решить эту проблему, не нарушая API моих классов?

Вы не можете, действительно.Но это не ваша ошибка: последняя версия

LitElement предоставляет метод экземпляра с именем update

То, что было критическим изменением,Поэтому, если вы обновите свою зависимость lit-element до последней версии, вам также потребуется сделать основную версию.Переименование вашего update метода для этого является естественным.Либо сохраните свой API и продолжайте использовать старую lit-element версию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...