Могу ли я использовать в скриптах Google Apps определенный класс в библиотеке с ES6 (V8)? - PullRequest
2 голосов
/ 28 февраля 2020

Я пытаюсь использовать класс, определенный в библиотеке, но в результате я получаю только ошибку.

[LibraryProject] /library/model/Update.gs

class Update {
  constructor(obj = {}) {
    if(typeof obj == "string"){
      options = JSON.parse(obj);
    }
    Object.assign(this, obj);
  }

  text(){
    return (this.message && this.message.text)?this.message.text:''
  }
}

ЗАДАЧИ

✅ Создать новую версию проекта. (Файл> Управление версиями ...)

✅ Загрузить эту библиотеку в другой проект [Alias: CustomService] (Ресурсы> Библиотеки ...)

✅ Использовать функции CustomService

❌ Использовать класс CustomService

Если я попытаюсь использовать класс

[NormalProject] /index.gs

function test  (){
  Logger.log(CustomService.libraryFunction())
  var update = new CustomService.Update("");
  Logger.log(update)
}

TypeError: CustomService.Update не является конструктором (версия 3, архив «Код»)

Как создать экземпляр объекта этого класса?

Если я бегу ...

In the image we can see the code and the error

Logger

We can see the two Logs, using function correctly and error when try to use Class constructir

Ответы [ 2 ]

3 голосов
/ 29 февраля 2020

Как написано в официальной документации,

Пользователям библиотеки доступны только следующие свойства в скрипте:

  • перечисляемые глобальные свойства
    • объявления функций,
    • переменные , созданные вне функции с помощью var, и свойства
    • , явно установленные для глобального объекта.

Это будет означать, что каждое свойство в глобальном объекте this доступно для пользователей библиотеки.

До ES6 все объявления вне функции (и сами объявления функций) были свойствами этого глобального объекта. После ES6 существует два вида глобальных записей:

  • Запись объекта - такая же, как ES5.

    • Объявления функций
    • Генераторы функций
    • Назначения переменных
  • Декларативная запись - Новая

    • Все остальное - let, const, class

Те, кто в декларативной записи не являются доступны из глобального "объекта", хотя сами они являются глобальными. Таким образом, объявление класса в библиотеке недоступно для пользователей библиотеки. Вы можете просто добавить присвоение переменной классу, чтобы добавить свойство к глобальному объекту ( вне любой функции ):

var Update = class Update{/*your code here*/}

Ссылки:

2 голосов
/ 28 февраля 2020

Судя по вашим тестам, вы не можете напрямую импортировать класс из библиотеки GAS. Я бы рекомендовал создать фабричный метод для создания экземпляра класса.

Что-то в этом роде:

// Library GAS project

/**
 * Foo class
 */
class Foo {
    constructor(params) {...}

    bar() {...}
}

/* globally accessible factory method */
function createFoo(fooParams) {
    return new Foo(fooParams);
} 

// Client GAS project

function test() {
    var foo = FooService.createFoo(fooParams);
    Logger.log(foo.bar());
}

...