Как объявить подтип с дополнительными свойствами в JSDoc для TypeScript? - PullRequest
0 голосов
/ 26 июня 2018

Как я могу использовать комментарии JSDoc, чтобы объявить компилятору TypeScript, что «тип X имеет все свойства типа Y, а также эти другие свойства»?

Дано:

/**
A base type with one property.

@typedef {object} Base
@prop {string} name
*/

/**
A subtype that adds a second property.

@typedef AugmentedBase
@type {Base}
@prop {number} age
*/

/**
 A function declared to return AugmentedBase, so name + age.

 @returns {AugmentedBase}
 */
const shouldReturnAugmentedBase = () => {
  return {name: 'a', age: 3}
}

Когда: Я проверил это, запустив:

tsc --allowJs --checkJs --noEmit index.js

Тогда: Я не ожидаю ошибок при проверке с помощью TypeScript.

Но: Фактически, он, кажется, игнорирует свойство, добавленное AugmentedBase, и обрабатывает его как только Base, судя по этой ошибке:

ошибка TS2322: тип '{ name: string; age: number; }' нельзя назначить типу 'Base'.

Литерал объекта может указывать только известные свойства, а 'age' не существует в типе 'Base'.

Обратите внимание на то, что буквально объект не совпадает с Base, несмотря на аннотацию @returns {AugmentedBase}!

Почему: Я пишу JavaScript в Visual Studio Code и хочу максимально использовать возможности TypeScript.

1 Ответ

0 голосов
/ 27 июня 2018

Вы не можете, не так, как на самом деле tsc намекает.

tsc (по крайней мере, начиная с 2.9.2) поддерживает присоединение @property s к имени @typedef только тогда, когда база @type объявлена ​​как object или object[].

Вы можете явно пропустить любые @property s, когда используете синтаксис @typedef {NotObject} MyType в этой точке в compiler / parser.ts: parseTypedefTag () .

Если вы попытаетесь стать умным и вместо этого поставите @type decl после всех @property decls, например:

/**
 @typedef MyType
 @property {string} x
 @type NotObject
*/

тогда компилятор TypeScript успешно проанализирует все свойства, только чтобы преднамеренно проигнорировать их в пользу того, что «тип MyType просто линейный NotAnObject» в , это чуть позже в компиляторе /parser.ts:parseTypedefTag().

...