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" νκ·Έλ₯Ό μ¬μ©νμ¬ νμ
μ μ΄λ¦μ μ°Έμ‘°ν μ μμ΅λλ€ (λ€μ κ²½μ° μ€ νλμΈ μμ νμ
κ³Ό 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;
TypeScriptλ ν΄λ‘μ ꡬ문μ μ°¨μ©ν©λλ€.
μ΄λ κ² νλ©΄ κ΄νΈλ‘ λ¬ΆμΈ ννμ μμ @type
νκ·Έλ₯Ό μΆκ°νμ¬ λ€λ₯Έ μ νμΌλ‘ νλ³νν μ μμ΅λλ€.
/**
* @type {number | string}
*/
var numberOrString = Math.random() < 0.5 ? "hello" : 100;
var typeAssertedNumber = /** @type {number} */ (numberOrString);
λ€λ₯Έ νμΌμμ μ¬μ©νκ³ μλ νμ λ€μ 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
μ νμ
κ΅¬λ¬ΈμΈ @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
λ 볡μ‘ν νμ
μ μ μν λ μ¬μ©ν©λλ€.
λ§μΉ @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 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) {
// ????
}
μ λ€λ¦ ν΄λμ€ νΉμ νμ μ μΈμ μ§μλμ§ μμ΅λλ€.
ν΄λμ€λ 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
νκ·Έλ₯Ό μ¬μ©νλ©΄ λ μ격ν κ²μ¬μ μ μ μ¬νμ νμΈν μ μμ΅λλ€:
// @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 {HTMLElement}
* @param {*} e
*/
function callbackForLater(e) {
this.clientHeight = parseInt(e); // μ μλν΄μΌ ν©λλ€!
}
Javascript ν΄λμ€λ₯Ό μ λ€λ¦ κΈ°λ° ν΄λμ€λ‘λΆν° μμ(extend)νλ©΄, 맀κ°λ³μκ° μ΄λ€ νμ
μ΄ λμ΄μΌ νλμ§ μ§μ ν κ³³μ΄ μμ΅λλ€. @extends
νκ·Έλ μ΄λ¬ν νμ
맀κ°λ³μλ₯Ό μν μμΉλ₯Ό μ 곡ν©λλ€:
/**
* @template T
* @extends {Set<T>}
*/
class SortableSet extends Set {
// ...
}
@extends
λ ν΄λμ€μμλ§ μλν©λλ€. νμ¬κΉμ§, μμ±μ ν¨μκ° ν΄λμ€λ₯Ό μμν μ μλ λ°©λ²μ μμ΅λλ€.
@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;
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();
}
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
λ λλ¬λΈν©λλ€.
TypeScriptλ μ§μνμ§ μλ JSDoc νκ·Έλ₯Ό 무μν©λλ€.
νκ·Έ μ§μμ μν μ€ν μ΄μκ° μλμ μμ΅λλ€:
@const
(issue #19672)@inheritdoc
(issue #23215)@memberof
(issue #7237)@readonly
(issue #17233)@yields
(issue #23857){@link β¦}
(issue #16498)