Укажите T, когда у вас есть "typeof T" в JSDOC и в VsCode - PullRequest
10 голосов
/ 29 июня 2019

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

полный исходный код

У меня есть Базовый класс и Derived, Derived2:

class Base {
    static get type() {
        return 'Base';
    }
}

class Derived extends Base {
}

class Derived2 extends Base {
}

Теперь у меня есть переменная t, которая может быть экземпляром Derived или Derived2.Он также может быть изменен несколько раз в течение времени выполнения.

/** @type {Base} */
var t = new Derived();
//or
var t = new Derived2();

И у меня есть функция, которая проверяет, является ли t экземпляром переданного класса, и возвращает t, если это экземпляр переданного класса или не определено иначе.

/**
 * @template {typeof Base} T
 * @param {T} cl
 * @returns {T}  /// <-- I can't figure out how o return an instance of T
 */
function checkTop( cl ) {
    if ( t instanceof cl ) {
        return t;
    }
    return undefined;
}

Когда я вызываю checkTop (Derived), его тип возвращаемого значения должен быть Derived.Но с вышеупомянутым jsdoc, его тип возвращаемого значения 'typeof Derived'.Но я хочу сделать тип возвращаемого значения просто «Derived».

let d1 = checkTop( Derived ); // 'typeof Derived', but I want 'Derived' as return type

d1 is recognized as 'typeof Derived'

аналогично, d2 распознается как «typeof Derived2»

let d2 = checkTop( Derived2 ); // 'typeof Derived2'.. but I want 'Derived2' as return type

d2 is recognized as 'typeof Derived2'

Как указать тип возврата в JSDOC, чтобы checkTop( Derived ); имел тип возврата как Derived, а возвращение checkTop( Derived2 )тип 'Derived2'.

Я попытался выполнить следующее для типа возвращаемого значения:

/**
 * @template {Base} B 
 * @template {typeof B} T
 * @param {T} cl
 * @returns {B}
 */
function checkTop( cl )

и

/**
 * @template {typeof Base} T
 * @param {T} cl
 * @returns {instanceof T}
 */
function checkTop( cl )

Если это невозможно в JSDOC, но возможно в машинописи, это также будет полезно, но я предпочитаю решение JSDOC.

Ответы [ 3 ]

1 голос
/ 10 июля 2019

Итак, я прочитал о jsdocs в Интернете, и вот мой вывод Я нашел нужный результат

Смотрите на скриншот и радуйтесь, проблема решена.

enter image description here

Так что же помогает в jsDocs

/**
 * @typedef {Object} 
 * @param {c1}
 */

вот фрагмент кода

class Base {
  static get type() {
      return 'Base';
  }
}

class Derived extends Base {
}

class Derived2 extends Base {
}

var t = new Derived();
var t1 = new Derived2();

/**
 * @typedef {Object} 
 * @param {c1}
 */
function checkTop( cl ) {
  if ( t instanceof cl ) {
      return t;
  }
  return undefined;
}

/**
 * @typedef {Object} 
 * @param {c1}
 */
function checkTop2( cl ) {
  if ( t1 instanceof cl ) {
      return t1;
  }
  return undefined;
}
var d1 = checkTop(Derived);
var d2 = checkTop2(Derived2);
0 голосов
/ 08 июля 2019

Вы запросили регистр, возможно ли это хотя бы в TypeScript. Да, это. Просто удалите свой комментарий JSDoc, и у вас появится предложение, которое вы ищете.

Для очистки вы можете просто сделать комментарий, который говорит только о том, что он возвращает. Этого достаточно.

enter image description here enter image description here

Вы просто переписывали правильные предложения TypeScript своими утверждениями (мнение программиста считается более важным, чем предложение TypeScript, поскольку программист знает, что он делает, когда явно что-то указывает).

0 голосов
/ 06 июля 2019

Возможно, я неправильно понимаю запрос здесь, но я думаю, что вам просто нужно вернуть cl вместо возврата t:

/**
 * @template {typeof Base} T
 * @param {T} cl
 * @returns {T}  /// <-- I can't figure out how o return an instance of T
 */
function checkTop( cl ) {
    if ( t instanceof cl ) {
        return cl;
    }
    return undefined;
}
...