Búsqueda de sitios web

typescript - Notación de tipo incompatible en JSDoc para Google Apps Script en línea vs localmente


Considera el siguiente guion

function caller(){
  getSpreadsheet1();// only the online IDE understands this
  getSpreadsheet2();// only the local IDE (VS Code) understands this
}

/**
 * @returns {SpreadsheetApp.Spreadsheet}
 */
function getSpreadsheet1(){
  var spreadsheet = SpreadsheetApp.openById('');
  return spreadsheet;
}

/**
 * @returns {GoogleAppsScript.Spreadsheet.Spreadsheet}
 */
function getSpreadsheet2(){
  var spreadsheet = SpreadsheetApp.openById('');
  return spreadsheet;
}

Si pegas este script en el IDE (nuevo) de Google Apps Script, colocar un punto (.) después de getSpreadsheet1() hará que el IDE muestre las funciones miembro de la clase Spreadsheet, como addEditor(), para efectos de autocompletado. Es decir, el IDE en línea entiende el tipo de getSpreadsheet1().

He intentado lograr el mismo comportamiento de manera local. Copié el script a un archivo local y ejecuté npm i -S @types/google-apps-script en la misma carpeta, según esta guía. Sin embargo, no obtengo autocompletado al colocar un punto después de getSpreadsheet1(), pero sí lo obtengo solo después de colocar el punto después de getSpreadsheet2().

Tenga en cuenta que mi IDE local (VS Code) sí entiende el tipo de SpreadsheetApp.openById(''), por lo que eso sí parece funcionar correctamente.

¿Hay alguna manera de hacer que mi IDE local entienda los comentarios de JSDoc que usan tipos como SpreadsheetApp.Spreadsheet requeridos por el IDE en línea?

Respuesta #1

Además de eliminar el @returns por completo para que Typescript infiera automáticamente el tipo de resultado, es posible hacer que funcione en ambos casos con el siguiente truco:

function caller() {
    getSpreadsheet1();// only the online IDE understands this
    getSpreadsheet2();// only the local IDE (VS Code) understands this
}

/**
 * @typedef {ReturnType<typeof SpreadsheetApp['openById']>} Spreadsheet
 */

/**
 * @returns {Spreadsheet}
 */
function getSpreadsheet1() {
    var spreadsheet = SpreadsheetApp.openById('');
    return spreadsheet;
}

/**
 * @returns {Spreadsheet}
 */
function getSpreadsheet2() {
    var spreadsheet = SpreadsheetApp.openById('');
    return spreadsheet;
}