Skip to content

Latest commit

Β 

History

History
638 lines (509 loc) Β· 16.8 KB

jsdoc-reference.md

File metadata and controls

638 lines (509 loc) Β· 16.8 KB
title layout permalink oneline
JSDoc Reference
docs
/docs/handbook/jsdoc-supported-types.html
What JSDoc does TypeScript-powered JavaScript support?

μ•„λž˜ λͺ©λ‘μ€ JavaScript νŒŒμΌμ— νƒ€μž… 정보 μ œκ³΅μ„ μœ„ν•΄ JSDoc μ–΄λ…Έν…Œμ΄μ…˜μ„ μ‚¬μš©ν•  λ•Œ ν˜„μž¬ μ§€μ›λ˜λŠ” κ΅¬μ„±μ˜ κ°œμš”λ₯Ό λ‹€λ£Ήλ‹ˆλ‹€.

μ•„λž˜ λͺ…μ‹œμ μœΌλ‘œ λ‚˜μ—΄λ˜μ§€ μ•Šμ€ νƒœκ·Έ(예 @async)λŠ” 아직 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

  • @type
  • @param (λ˜λŠ” @arg λ˜λŠ” @argument)
  • @returns (λ˜λŠ” @return)
  • @typedef
  • @callback
  • @template
  • @class (λ˜λŠ” @constructor)
  • @this
  • @extends (λ˜λŠ” @augments)
  • @enum

μ˜λ―ΈλŠ” 일반적으둜 jsdoc.appμ—μ„œ μ œκ³΅ν•˜λŠ” νƒœκ·Έμ˜ μ˜λ―Έμ™€ κ°™κ±°λ‚˜ μƒμœ„ μ§‘ν•©μž…λ‹ˆλ‹€. μ•„λž˜ μ½”λ“œλŠ” 각 νƒœκ·Έμ˜ 차이점을 μ„€λͺ…ν•˜κ³  μ˜ˆμ‹œλ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

Note: JSDoc 지원을 νƒμƒ‰ν•˜λŠ” playgroundλ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

@type

"@type" νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ νƒ€μž…μ˜ 이름을 μ°Έμ‘°ν•  수 μžˆμŠ΅λ‹ˆλ‹€ (λ‹€μŒ 경우 쀑 ν•˜λ‚˜μΈ μ›μ‹œ νƒ€μž…κ³Ό TypeScript에 μ •μ˜λ˜μ–΄μžˆκ±°λ‚˜ JSDoc "@typedef" νƒœκ·Έλ‘œ μ •μ˜λ˜μ–΄μžˆκ±°λ‚˜). 당신은 λŒ€λΆ€λΆ„ JSDoc νƒ€μž…λ“€μ΄λ‚˜ TypeScript νƒ€μž…μ„ μ‚¬μš©ν•  κ²ƒμž…λ‹ˆλ‹€,기쑴에 많이 μ‚¬μš©ν•˜λŠ” stringλΆ€ν„° 쑰건뢀 νƒ€μž…μΈ κ³ κΈ‰ νƒ€μž…κΉŒμ§€.

/**
 * @type {string}
 */
var s;

/** @type {Window} */
var win;

/** @type {PromiseLike<string>} */
var promisedString;

// DOM ν”„λ‘œνΌν‹°λ₯Ό μ‚¬μš©ν•˜μ—¬ HTML μš”μ†Œλ₯Ό 지정할 수 μžˆμŠ΅λ‹ˆλ‹€
/** @type {HTMLElement} */
var myElement = document.querySelector(selector);
element.dataset.myData = "";

@type 을 μ΄μš©ν•˜μ—¬ μœ λ‹ˆμ–Έ νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ μ–΄λ–€ 것은 string λ˜λŠ” boolean 일 수 μžˆμŠ΅λ‹ˆλ‹€.

/**
 * @type {(string | boolean)}
 */
var sb;

κ΄„ν˜ΈλŠ” μœ λ‹ˆμ–Έ νƒ€μž…μ— λŒ€ν•œ 선택 μ‚¬ν•­μž…λ‹ˆλ‹€.

/**
 * @type {string | boolean}
 */
var sb;

λ‹€μ–‘ν•œ ꡬ문을 ν†΅ν•˜μ—¬ λ°°μ—΄ νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€:

/** @type {number[]} */
var ns;
/** @type {Array.<number>} */
var nds;
/** @type {Array<number>} */
var nas;

λ˜ν•œ 객체 λ¦¬ν„°λŸ΄ νƒ€μž…λ“€λ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄, μ˜€λΈŒμ νŠΈμ— ν”„λ‘œνΌν‹° 'a' (string) 와 'b' (number)을 μ‚¬μš©ν•œ 경우 λ‹€μŒ ꡬ문을 μ‚¬μš©ν•©λ‹ˆλ‹€:

/** @type {{ a: string, b: number }} */
var var9;

당신은 JSDoc κ΅¬λ¬Έμ΄λ‚˜ TypeScript ꡬ문을 μ‚¬μš©ν•˜μ—¬ λ¬Έμžμ—΄ 및 숫자 인덱슀 맡과 λ°°μ—΄κ³Ό λΉ„μŠ·ν•œ 였브젝트λ₯Ό ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

/**
 * 맡 같은 objectλŠ” μž„μ˜μ˜ `string` ν”„λ‘œνΌν‹°λ“€μ„ `number`둜 λ°”κΏ”μ€λ‹ˆλ‹€.
 *
 * @type {Object.<string, number>}
 */
var stringToNumber;

/** @type {Object.<number, object>} */
var arrayLike;

μ•žμ˜ 두 νƒ€μž…μ€ TypeScript의 νƒ€μž…μΈ { [x: string]: number } 와 { [x: number]: any }λ₯Ό λ™μΌν•©λ‹ˆλ‹€. μ»΄νŒŒμΌλŸ¬λŠ” 이 두 ꡬ문을 λͺ¨λ‘ μ΄ν•΄ν•©λ‹ˆλ‹€.

TypeScriptλ‚˜ ν΄λ‘œμ € ꡬ문을 μ‚¬μš©ν•˜μ—¬ ν•¨μˆ˜ νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€:

/** @type {function(string, boolean): number} ν΄λ‘œμ € ꡬ문 */
var sbn;
/** @type {(s: string, b: boolean) => number} TypeScript ꡬ문 */
var sbn2;

ν˜Ήμ€ νŠΉμ •ν•˜μ§€ μ•Šμ€ Function νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

/** @type {Function} */
var fn7;
/** @type {function} */
var fn6;

ν΄λ‘œμ €μ˜ λ‹€λ₯Έ νƒ€μž…λ“€ λ˜ν•œ μž‘λ™ν•©λ‹ˆλ‹€:

/**
 * @type {*} - 'any' νƒ€μž…μœΌλ‘œ μ“Έ 수 μžˆμŠ΅λ‹ˆλ‹€
 */
var star;
/**
 * @type {?} - μ•Œ 수 μ—†λŠ” νƒ€μž… ('any'와 κ°™μŠ΅λ‹ˆλ‹€)
 */
var question;

ν˜•λ³€ν™˜ (Casts)

TypeScriptλŠ” ν΄λ‘œμ € ꡬ문을 μ°¨μš©ν•©λ‹ˆλ‹€. μ΄λ ‡κ²Œ ν•˜λ©΄ κ΄„ν˜Έλ‘œ 묢인 ν‘œν˜„μ‹ μ•žμ— @type νƒœκ·Έλ₯Ό μΆ”κ°€ν•˜μ—¬ λ‹€λ₯Έ μœ ν˜•μœΌλ‘œ ν˜•λ³€ν™˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

/**
 * @type {number | string}
 */
var numberOrString = Math.random() < 0.5 ? "hello" : 100;
var typeAssertedNumber = /** @type {number} */ (numberOrString);

νƒ€μž… κ°€μ Έμ˜€κΈ° (Import types)

λ‹€λ₯Έ νŒŒμΌμ—μ„œ μ‚¬μš©ν•˜κ³  μžˆλŠ” νƒ€μž…λ“€μ€ import 선언을 ν†΅ν•˜μ—¬ κ°€μ Έμ˜¬ 수 μžˆμŠ΅λ‹ˆλ‹€. 이 ꡬ문은 TypeScript에 따라 λ‹€λ₯΄λ©° JSDoc ν‘œμ€€κ³Ό λ‹€λ¦…λ‹ˆλ‹€:

// @filename: types.d.ts
export type Pet = {
  name: string,
};

// @filename: main.js
/**
 * @param p { import("./types").Pet }
 */
function walk(p) {
  console.log(`Walking ${p.name}...`);
}

κ°€μ Έμ˜¨ νƒ€μž…λ“€ λ˜ν•œ 별칭 μ„ μ–Έμ—μ„œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

// @filename: types.d.ts
export type Pet = {
  name: string,
};
// @filename: main.js
// ---cut---
/**
 * @typedef { import("./types").Pet } Pet
 */

/**
 * @type {Pet}
 */
var myPet;
myPet.name;

λ§Œμ•½ μ•Œ 수 μ—†λŠ” νƒ€μž…μ΄κ±°λ‚˜ λ„ˆλ¬΄ 큰 νƒ€μž…μΌ 경우 λͺ¨λ“ˆμ—μ„œ μ–»μ–΄μ˜¨ κ°’μ˜ νƒ€μž…μ„ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€:

// @filename: accounts.d.ts
export const userAccount = {
  name: "Name",
  address: "An address",
  postalCode: "",
  country: "",
  planet: "",
  system: "",
  galaxy: "",
  universe: "",
};
// @filename: main.js
// ---cut---
/**
 * @type {typeof import("./accounts").userAccount }
 */
var x = require("./accounts").userAccount;

@param κ³Ό @returns

@param은 νƒ€μž… ꡬ문인 @typeκ³Ό λ™μΌν•˜κ²Œ μ‚¬μš©ν•©λ‹ˆλ‹€, ν•˜μ§€λ§Œ λ§€κ°œλ³€μˆ˜ 이름을 μΆ”κ°€ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜λŠ” 이름 주변에 λŒ€κ΄„ν˜Έμ™€ ν•¨κ»˜ μ„ νƒμ μœΌλ‘œ μ„ μ–Έλ©λ‹ˆλ‹€:

// λ§€κ°œλ³€μˆ˜λ“€μ€ λ‹€μ–‘ν•œ κ΅¬λ¬Έν˜•μ‹μœΌλ‘œ 선언될 수 μžˆμŠ΅λ‹ˆλ‹€
/**
 * @param {string}  p1 - string λ§€κ°œλ³€μˆ˜.
 * @param {string=} p2 - 선택적 λ§€κ°œλ³€μˆ˜ (ν΄λ‘œμ € ꡬ문)
 * @param {string} [p3] - λ˜λ‹€λ₯Έ 선택적 λ§€κ°œλ³€μˆ˜ (JSDoc ꡬ문).
 * @param {string} [p4="test"] - κΈ°λ³Έκ°’κ³Ό 선택적 λ§€κ°œλ³€μˆ˜
 * @return {string} 이것은 κ²°κ³Ό κ°’μž…λ‹ˆλ‹€
 */
function stringsStringStrings(p1, p2, p3, p4) {
  // TODO
}

λ§ˆμ°¬κ°€μ§€λ‘œ, ν•¨μˆ˜μ˜ λ°˜ν™˜ν˜•μΌ 경우:

/**
 * @return {PromiseLike<string>}
 */
function ps() {}

/**
 * @returns {{ a: string, b: number }} - May use '@returns' as well as '@return'
 */
function ab() {}

@typedef, @callback, and @param

@typedef λŠ” λ³΅μž‘ν•œ νƒ€μž…μ„ μ •μ˜ν•  λ•Œ μ‚¬μš©ν•©λ‹ˆλ‹€. 마치 @paramκ³Ό λΉ„μŠ·ν•˜κ²Œ λ™μž‘ν•©λ‹ˆλ‹€.

/**
 * @typedef {Object} SpecialType - μƒˆλ‘œμš΄ νƒ€μž…μΈ 'SpecialType'을 μƒμ„±ν•©λ‹ˆλ‹€
 * @property {string} prop1 - SpecialType의 string ν”„λ‘œνΌν‹°
 * @property {number} prop2 - SpecialType의 number ν”„λ‘œνΌν‹°
 * @property {number=} prop3 - SpecialType의 선택적 number ν”„λ‘œνΌν‹°
 * @prop {number} [prop4] - SpecialType의 선택적 number ν”„λ‘œνΌν‹°
 * @prop {number} [prop5=42] - SpecialType의 기본값이 μ‘΄μž¬ν•˜λŠ” 선택적 number ν”„λ‘œνΌν‹°
 */

/** @type {SpecialType} */
var specialTypeObject;
specialTypeObject.prop3;

object ν˜Ήμ€ Objectλ₯Ό 첫 번째 쀄에 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

/**
 * @typedef {object} SpecialType1 - μƒˆλ‘œμš΄ νƒ€μž…μΈ 'SpecialType'을 μƒμ„±ν•©λ‹ˆλ‹€
 * @property {string} prop1 - SpecialType의 string ν”„λ‘œνΌν‹°
 * @property {number} prop2 - SpecialType의 number ν”„λ‘œνΌν‹°
 * @property {number=} prop3 - SpecialType의 선택적 number ν”„λ‘œνΌν‹°
 */

/** @type {SpecialType1} */
var specialTypeObject1;

@param 은 ν•œ 번만 μ‚¬μš©ν•˜λŠ” νƒ€μž…κ³Ό λΉ„μŠ·ν•œ ꡬ문을 ν—ˆμš©ν•©λ‹ˆλ‹€. ν¬ν•¨λœ ν”„λ‘œνΌν‹°μ˜ 이름은 νŒŒλΌλ―Έν„°μ˜ 이름을 μ ‘λ‘μ‚¬λ‘œ μ‚¬μš©ν•΄μ•Ό ν•©λ‹ˆλ‹€:

/**
 * @param {Object} options - μœ„μ˜ SpecialType와 λΉ„μŠ·ν•©λ‹ˆλ‹€.
 * @param {string} options.prop1
 * @param {number} options.prop2
 * @param {number=} options.prop3
 * @param {number} [options.prop4]
 * @param {number} [options.prop5=42]
 */
function special(options) {
  return (options.prop4 || 1001) + options.prop5;
}

@callback은 @typedef와 λΉ„μŠ·ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ 이것은 object νƒ€μž… λŒ€μ‹  νŠΉμ •ν•œ function νƒ€μž…μ„ μ§€μ •ν•©λ‹ˆλ‹€:

/**
 * @callback Predicate
 * @param {string} data
 * @param {number} [index]
 * @returns {boolean}
 */

/** @type {Predicate} */
const ok = (s) => !(s.length % 2);

λ¬Όλ‘ , 이런 νƒ€μž…λ“€μ€ TypeScript κ΅¬λ¬Έμ—μ„œ @typedef 단 ν•œ μ€„λ‘œ μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€:

/** @typedef {{ prop1: string, prop2: string, prop3?: number }} SpecialType */
/** @typedef {(data: string, index?: number) => boolean} Predicate */

@template

@template νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜μ—¬ μ œλ„€λ¦­ ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€:

/**
 * @template T
 * @param {T} x - μ œλ„€λ¦­ λ§€κ°œλ³€μˆ˜λŠ” 리턴 νƒ€μž…κ³Ό κ°™κ²Œ λ©λ‹ˆλ‹€
 * @return {T}
 */
function id(x) {
  return x;
}

const a = id("string");
const b = id(123);
const c = id({});

콀마 ν˜Ήμ€ μ—¬λŸ¬ νƒœκ·Έλ₯Ό ν†΅ν•˜μ—¬ μ—¬λŸ¬ νƒ€μž…μ˜ λ§€κ°œλ³€μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€:

/**
 * @template T,U,V
 * @template W,X
 */

λ˜ν•œ νŠΉμ •ν•œ λ§€κ°œλ³€μˆ˜ μ•žμ— νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€. λ§€κ°œλ³€μˆ˜ 쀑 였직 첫 번째 λ§€κ°œλ³€μˆ˜λ§Œ μ œν•œλ©λ‹ˆλ‹€:

/**
 * @template {string} K - KλŠ” string ν˜Ήμ€ string λ¦¬ν„°λŸ΄μ΄μ–΄μ•Ό ν•©λ‹ˆλ‹€
 * @template {{ serious(): string }} Seriousalizable - serious λ©”μ„œλ“œκ°€ μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€
 * @param {K} key
 * @param {Seriousalizable} object
 */
function seriousalize(key, object) {
  // ????
}

μ œλ„€λ¦­ 클래슀 ν˜Ήμ€ νƒ€μž… 선언은 μ§€μ›λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

클래슀 (Classes)

ν΄λž˜μŠ€λŠ” ES6 클래슀둜 μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€.

class C {
  /**
   * @param {number} data
   */
  constructor(data) {
    // ν”„λ‘œνΌν‹° νƒ€μž…μ€ 좔둠될 수 μžˆμŠ΅λ‹ˆλ‹€
    this.name = "foo";

    // λ˜λŠ” λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€
    /** @type {string | null} */
    this.title = null;

    // λ§Œμ•½ λ‹€λ₯Έ 곳에 μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ ν‘œκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    /** @type {number} */
    this.size;

    this.initialize(data); // 였λ₯˜κ°€ λ‚œλ‹€λ©΄, μ΄λ‹ˆμ…œ λΌμ΄μ €λŠ” string을 μ˜ˆμƒν•©λ‹ˆλ‹€
  }
  /**
   * @param {string} s
   */
  initialize = function (s) {
    this.size = s.length;
  };
}

var c = new C(0);

// CλŠ” new 와 ν•¨κ»˜ ν˜ΈμΆœλ˜μ–΄μ•Όν•©λ‹ˆλ‹€
// ν•˜μ§€λ§Œ 이건 JavaScript이고, 이것은 ν—ˆμš©λ˜λ©°
// 'any'둜 κ°„μ£Όλ©λ‹ˆλ‹€.
var result = C(1);

λ‹€μŒ μ„Ήμ…˜μ— μ„€λͺ…λœ λŒ€λ‘œ μƒμ„±μž ν•¨μˆ˜λ₯Ό μ„ μ–Έν•  수 μžˆμŠ΅λ‹ˆλ‹€:

@constructor

μ»΄νŒŒμΌλŸ¬λŠ” 속성 할당을 기반으둜 μƒμ„±μž ν•¨μˆ˜λ₯Ό μΆ”λ‘ ν•©λ‹ˆλ‹€, ν•˜μ§€λ§Œ @constructor νƒœκ·Έλ₯Ό μ‚¬μš©ν•˜λ©΄ 더 μ—„κ²©ν•œ 검사와 μ œμ•ˆ 사항을 확인할 수 μžˆμŠ΅λ‹ˆλ‹€:

// @checkJs
// @errors: 2345 2348
/**
 * @constructor
 * @param {number} data
 */
function C(data) {
  // ν”„λ‘œνΌν‹° νƒ€μž…μ€ 좔둠될 수 μžˆμŠ΅λ‹ˆλ‹€
  this.name = "foo";

  // λ˜λŠ” λͺ…μ‹œμ μœΌλ‘œ μ„ μ–Έν•  μˆ˜λ„ μžˆμŠ΅λ‹ˆλ‹€
  /** @type {string | null} */
  this.title = null;

  // λ§Œμ•½ λ‹€λ₯Έ 곳에 μ„ μ–Έλ˜μ–΄ μžˆλ‹€λ©΄ μ–΄λ…Έν…Œμ΄μ…˜μœΌλ‘œ ν‘œκΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  /** @type {number} */
  this.size;

  this.initialize(data);
}
/**
 * @param {string} s
 */
C.prototype.initialize = function (s) {
  this.size = s.length;
};

var c = new C(0);
c.size;

var result = C(1);

Note: 였λ₯˜ λ©”μ‹œμ§€λŠ” a JSConfig 및 checkJsκ°€ ν™œμ„±ν™”λœ μƒνƒœμ—μ„œλ§Œ JS μ½”λ“œ λ² μ΄μŠ€μ— λ‚˜νƒ€λ‚©λ‹ˆλ‹€.

@constructorλ₯Ό μ‚¬μš©ν•˜λ©΄ μƒμ„±μž ν•¨μˆ˜ Cμ•ˆμ— thisκ°€ μžˆλŠ”μ§€ κ²€μ‚¬ν•˜λ―€λ‘œ, initialize λ©”μ„œλ“œμ— λŒ€ν•œ μ œμ•ˆμ‚¬ν•­μ„ λ°›μœΌλ©° λ§Œμ•½ 인자둜 숫자λ₯Ό λ„˜κΈ΄λ‹€λ©΄ 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. λ˜ν•œ Cλ₯Ό μƒμ„±ν•˜μ§€ μ•Šκ³  호좜만 ν•œλ‹€λ©΄ μ—λ””ν„°μ—μ„œ κ²½κ³ λ₯Ό ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€.

μœ κ°μŠ€λŸ½κ²Œλ„, μ΄λŠ” ν˜ΈμΆœκ°€λŠ₯ν•œ μƒμ„±μž ν•¨μˆ˜λŠ” @constructorλ₯Ό μ‚¬μš©ν•˜μ§€ λͺ»ν•¨μ„ μ˜λ―Έν•©λ‹ˆλ‹€.

@this

μ»΄νŒŒμΌλŸ¬λŠ” μ½”λ“œκ°€ λ™μž‘ν•  μ»¨ν…μŠ€νŠΈκ°€ μžˆλ‹€λ©΄ 보톡 this의 νƒ€μž…μ„ νŒŒμ•…ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 그렇지 μ•Šμ€ 경우, @thisλ₯Ό μ‚¬μš©ν•˜μ—¬ λͺ…ν™•ν•˜κ²Œ this의 νƒ€μž…μ„ 지정할 수 μžˆμŠ΅λ‹ˆλ‹€:

/**
 * @this {HTMLElement}
 * @param {*} e
 */
function callbackForLater(e) {
  this.clientHeight = parseInt(e); // 잘 μž‘λ™ν•΄μ•Ό ν•©λ‹ˆλ‹€!
}

@extends

Javascript 클래슀λ₯Ό μ œλ„€λ¦­ 기반 ν΄λž˜μŠ€λ‘œλΆ€ν„° 상속(extend)ν•˜λ©΄, λ§€κ°œλ³€μˆ˜κ°€ μ–΄λ–€ νƒ€μž…μ΄ λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ 지정할 곳이 μ—†μŠ΅λ‹ˆλ‹€. @extends νƒœκ·ΈλŠ” μ΄λŸ¬ν•œ νƒ€μž… λ§€κ°œλ³€μˆ˜λ₯Ό μœ„ν•œ μœ„μΉ˜λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€:

/**
 * @template T
 * @extends {Set<T>}
 */
class SortableSet extends Set {
  // ...
}

@extendsλŠ” ν΄λž˜μŠ€μ—μ„œλ§Œ μž‘λ™ν•©λ‹ˆλ‹€. ν˜„μž¬κΉŒμ§€, μƒμ„±μž ν•¨μˆ˜κ°€ 클래슀λ₯Ό 상속할 수 μžˆλŠ” 방법은 μ—†μŠ΅λ‹ˆλ‹€.

@enum

@enum νƒœκ·ΈλŠ” 멀버가 λͺ¨λ‘ μ§€μ •λœ 객체 λ¦¬ν„°λŸ΄μ„ λ§Œλ“€ 수 있게 λ„μ™€μ€λ‹ˆλ‹€. Javascript λŒ€λΆ€λΆ„μ˜ 객체 λ¦¬ν„°λŸ΄κ³Ό 달리, 이 νƒœκ·ΈλŠ” λ‹€λ₯Έ 멀버λ₯Ό ν—ˆμš©ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

/** @enum {number} */
const JSDocState = {
  BeginningOfLine: 0,
  SawAsterisk: 1,
  SavingComments: 2,
};

JSDocState.SawAsterisk;

@enum은 TypeScript의 enumκ³Ό μƒλ‹Ήνžˆ λ‹€λ₯΄κ³ , 더 κ°„λ‹¨ν•©λ‹ˆλ‹€. ν•˜μ§€λ§Œ TypeScript의 μ—΄κ±°ν˜•(enum)κ³Ό 달리, @enum은 μ–΄λ– ν•œ νƒ€μž…λ„ κ°€μ§ˆ 수 μžˆμŠ΅λ‹ˆλ‹€:

/** @enum {function(number): number} */
const MathFuncs = {
  add1: (n) => n + 1,
  id: (n) => -n,
  sub1: (n) => n - 1,
};

MathFuncs.add1;

μΆ”κ°€ 예제 (More examples)

class Foo {}
// ---cut---
var someObj = {
  /**
   * @param {string} param1 - ν”„λ‘œνΌν‹° ν• λ‹Ή λ¬Έμ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”
   */
  x: function (param1) {},
};

/**
 * λ³€μˆ˜ ν• λ‹Ή λ¬Έμ„œλ₯Ό μ°Έμ‘°ν•˜μ„Έμš”
 * @return {Window}
 */
let someFunc = function () {};

/**
 * 클래슀 λ©”μ„œλ“œ
 * @param {string} greeting μ‚¬μš©ν•  인사말
 */
Foo.prototype.sayHi = (greeting) => console.log("Hi!");

/**
 * ν™”μ‚΄ν‘œ ν•¨μˆ˜ ν‘œν˜„μ‹
 * @param {number} x - κ³±ν•˜λŠ” 수
 */
let myArrow = (x) => x * x;

/**
 * JSX의 λ¬΄μƒνƒœ ν•¨μˆ˜ν˜• μ»΄ν¬λ„ŒνŠΈ(SFC)에도 μž‘λ™ν•©λ‹ˆλ‹€
 * @param {{a: string, b: number}} test - Some param
 */
var sfc = (test) => <div>{test.a.charAt(0)}</div>;

/**
 * λ§€κ°œλ³€μˆ˜λŠ” ν΄λ‘œμ € ꡬ문을 μ‚¬μš©ν•˜λ©΄ 클래슀 μƒμ„±μžλ‘œ μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
 *
 * @param {{new(...args: any[]): object}} C - The class to register
 */
function registerClass(C) {}

/**
 * @param {...string} p1 - 'λ‚˜λ¨Έμ§€' λ¬Έμžμ—΄ μΈμˆ˜λ“€μ˜ λ°°μ—΄ ('any' νƒ€μž…μœΌλ‘œ 취급됨)
 */
function fn10(p1) {}

/**
 * @param {...string} p1 - 'λ‚˜λ¨Έμ§€' λ¬Έμžμ—΄ μΈμˆ˜λ“€μ˜ λ°°μ—΄ ('any' νƒ€μž…μœΌλ‘œ 취급됨)
 */
function fn9(p1) {
  return p1.join();
}

μ§€μ›ν•˜μ§€ μ•ŠλŠ”λ‹€κ³  μ•Œλ €μ§„ νŒ¨ν„΄ (Patterns that are known NOT to be supported)

Value space μ•ˆμ˜ 객체λ₯Ό νƒ€μž…μœΌλ‘œ νƒœκ·Έν•˜λŠ” 것은 객체가 마치 μƒμ„±μž ν•¨μˆ˜μ²˜λŸΌ νƒ€μž…μ„ μƒμ„±ν•˜μ§€ μ•ŠλŠ” 이상 μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

function aNormalFunction() {}
/**
 * @type {aNormalFunction}
 */
var wrong;
/**
 * 'typeof'λ₯Ό λŒ€μ‹  μ‚¬μš©ν•˜μ„Έμš”:
 * @type {typeof aNormalFunction}
 */
var right;

접미사(Postfix)λŠ” 선택적(Optional) ν”„λ‘œνΌν‹°λ₯Ό κ΅¬μ²΄ν™”ν•˜μ§€ μ•ŠλŠ” 객체 λ¦¬ν„°λŸ΄ νƒ€μž…μ˜ ν”„λ‘œνΌν‹° νƒ€μž…κ³Ό κ°™μŠ΅λ‹ˆλ‹€:

/**
 * @type {{ a: string, b: number= }}
 */
var wrong;
/**
 * ν”„λ‘œνΌν‹° 이름 λŒ€μ‹  λ¬ΌμŒν‘œ 접미사λ₯Ό μ‚¬μš©ν•˜μ„Έμš”:
 * @type {{ a: string, b?: number }}
 */
var right;

strictNullCheckκ°€ ν™œμ„±ν™” 쀑인 κ²½μš°μ—λ§Œ λ„λŸ¬λΈ”(Nullable) νƒ€μž…μ΄ μ˜λ―Έκ°€ μžˆμŠ΅λ‹ˆλ‹€.

/**
 * @type {?number}
 * With strictNullChecks: true  -- number | null
 * With strictNullChecks: false -- number
 */
var nullable;

μœ λ‹ˆμ–Έ νƒ€μž…μ„ μ‚¬μš©ν•΄λ„ λ©λ‹ˆλ‹€:

/**
 * @type {number | null}
 * With strictNullChecks: true  -- number | null
 * With strictNullChecks: false -- number
 */
var unionNullable;

λ„λŸ¬λΈ” νƒ€μž…μ΄ μ•„λ‹Œ κ²½μš°μ—λŠ” 아무 μ˜λ―Έκ°€ μ—†μœΌλ©° μ›λž˜ νƒ€μž…μœΌλ‘œ μ·¨κΈ‰ν•©λ‹ˆλ‹€:

/**
 * @type {!number}
 * νƒ€μž… numberλ₯Ό κ°€μ§‘λ‹ˆλ‹€
 */
var normal;

JSDoc의 νƒ€μž… 체계와 달리, TypeScriptλŠ” νƒ€μž…μ΄ 였직 null을 ν¬ν•¨ν•˜κ±°λ‚˜ ν•˜μ§€ μ•ŠλŠ”λ‹€ ν‘œμ‹œν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ„λŸ¬λΈ”μ€ λͺ…ν™•ν•˜κ²Œ κ΅¬λΆ„λ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€ -- λ§Œμ•½ strictNullChecksκ°€ ν™œμ„±ν™” 쀑이라면, numberλŠ” λ„λŸ¬λΈ”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€. λ°˜λŒ€μ˜ 경우, numberλŠ” λ„λŸ¬λΈ”ν•©λ‹ˆλ‹€.

μ§€μ›ν•˜μ§€ μ•ŠλŠ” νƒœκ·Έ (Unsupported tags)

TypeScriptλŠ” μ§€μ›ν•˜μ§€ μ•ŠλŠ” JSDoc νƒœκ·Έλ₯Ό λ¬΄μ‹œν•©λ‹ˆλ‹€.

νƒœκ·Έ 지원을 μœ„ν•œ μ˜€ν”ˆ μ΄μŠˆκ°€ μ•„λž˜μ— μžˆμŠ΅λ‹ˆλ‹€: