Dibawah ini adalah daftar anotasi yang didukung saat menggunakan JSDoc untuk menyediakan informasi di berkas Javscript.
Perhatikan semua tag yang tidak secara eksplisit dicantumkan di bawah (seperti @ async
) belum didukung.
@type
@param
(atau@arg
atau@argument
)@returns
(atau@return
)@typedef
@callback
@template
@class
(atau@constructor
)@this
@extends
(atau@augments
)@enum
Ekstensi class
- Property Modifiers
@public
,@private
,@protected
,@readonly
Artinya biasanya sama, atau superset, dari arti tag yang diberikan di jsdoc.app. Kode dibawah mendeskripsikan perbedaan dan beberapa contoh dari setiap tag-nya.
Catatan: Anda bisa menggunakan playground untuk mengeksplor dukungan JSDoc.
@type
Anda dapat menggunakan tag “@type” dan mereferensikan nama jenis (baik primitif, ditentukan dalam deklarasi TypeScript, atau dalam tag “@typedef” JSDoc).
Anda dapat menggunakan sebagian besar jenis JSDoc dan jenis TypeScript apa pun, dari yang paling dasar seperti string
hingga yang paling canggih, seperti jenis bersyarat.
jsTry
/*** @type {string}*/vars ;/** @type {Window} */varwin ;/** @type {PromiseLike<string>} */varpromisedString ;// Anda dapat menentukan Elemen HTML dengan properti DOM/** @type {HTMLElement} */varmyElement =document .querySelector (selector );element .dataset .myData = "";
@type
dapat menetapkan tipe gabungan — misalnya, sesuatu bisa berupa string atau boolean.
jsTry
/*** @type {(string | boolean)}*/varsb ;
Perhatikan bahwa tanda kurung bersifat opsional untuk tipe gabungan.
jsTry
/*** @type {string | boolean}*/varsb ;
Anda dapat menentukan tipe array menggunakan berbagai sintaks:
jsTry
/** @type {number[]} */varns ;/** @type {Array.<number>} */varnds ;/** @type {Array<number>} */varnas ;
Anda juga dapat menentukan tipe literal objek. Misalnya, objek dengan properti ‘a’ (string) dan ‘b’ (angka) menggunakan sintaks berikut:
jsTry
/** @type {{ a: string, b: number }} */varvar9 ;
Anda dapat menentukan objek seperti map dan array menggunakan index signature string dan angka, menggunakan sintaks JSDoc standar atau sintaks TypeScript.
jsTry
/*** Objek map yang memetakan kunci string dan nilainya bertipe number.** @type {Object.<string, number>}*/varstringToNumber ;/** @type {Object.<number, object>} */vararrayLike ;
Dua jenis sebelumnya sama dengan tipe TypeScript { [x: string]: number }
dan { [x: number]: any }
. Kompilator memahami kedua sintaks tersebut.
Anda dapat menentukan jenis fungsi menggunakan sintaks TypeScript atau Closure:
jsTry
/** @type {function(string, boolean): number} Closure syntax */varsbn ;/** @type {(s: string, b: boolean) => number} TypeScript syntax */varsbn2 ;
Atau anda dapat menggunakan type Function
yang tidak ditentukan:
jsTry
/** @type {Function} */varfn7 ;/** @type {function} */varfn6 ;
Type lainnya dari Closure juga berfungsi:
jsTry
/*** @type {*} - can be 'any' type*/varstar ;/*** @type {?} - unknown type (same as 'any')*/varquestion ;
Casts
TypeScript meminjam sintaks cast dari Closure.
Ini memungkinkan Anda mentransmisikan tipe ke tipe lain dengan menambahkan tag @type
sebelum ekspresi dalam tanda kurung.
jsTry
/*** @type {number | string}*/varnumberOrString =Math .random () < 0.5 ? "hello" : 100;vartypeAssertedNumber = /** @type {number} */ (numberOrString );
Impor type
Anda bisa juga mengimpor deklarasi dari berkas lain menggunakan impor tipe. Sintaks ini khusus untuk TypeScript dan berbeda dari standar JSDoc:
jsTry
// @filename: types.d.tsexport typePet = {name : string,};// @filename: main.js/*** @param p { import("./types").Pet }*/functionwalk (p ) {console .log (`Walking ${p .name }...`);}
mengimpor tipe juga dapat digunakan di deklarasi tipe alias:
jsTry
/*** @typedef { import("./types").Pet } Pet*//*** @type {Pet}*/varmyPet ;myPet .name ;
Mengimpor tipe dapat digunakan untuk mendapatkan tipe nilai dari modul, jika Anda tidak mengetahui jenisnya, atau jika nilai tersebut memiliki tipe yang besar yang dapat mengganggu untuk diketik:
jsTry
/*** @type {typeof import("./accounts").userAccount }*/varx =require ("./accounts").userAccount ;
@param
and @returns
@param
menggunakan jenis sintaks yang sama dengan @type
, tapi dengan tambahan sebuah nama parameter.
Parameter juga dapat dideklarasikan secara opsional dengan membungkus namanya menggunakan kurung siku:
jsTry
// Parameter dapat dideklarasikan dalam berbagai bentuk sintaksis/*** @param {string} p1 - Parameter string.* @param {string=} p2 - Opsional param (sintaks Closure)* @param {string} [p3] - Opsional param lainnya (sintaks JSDoc).* @param {string} [p4="test"] - Opsional param dengan nilai standar* @return {string} Ini adalah hasilnya*/functionstringsStringStrings (p1 ,p2 ,p3 ,p4 ) {// MELAKUKAN}
Demikian juga, untuk tipe kembalian suatu fungsi:
jsTry
/*** @return {PromiseLike<string>}*/functionps () {}/*** @returns {{ a: string, b: number }} - Dapat menggunakan '@returns' serta '@return'*/functionab () {}
@typedef
, @callback
, and @param
@ty[edef
juga dapat digunakan untuk mendefinisikan tipe yang kompleks.
Sintaks yang bekerja dengan @params
.
jsTry
/*** @typedef {Object} SpecialType - buat type baru bernama 'SpecialType'* @property {string} prop1 - properti string dari SpecialType* @property {number} prop2 - properti number dari SpecialType* @property {number=} prop3 - properti number opsional dari SpecialType* @prop {number} [prop4] - properti number opsional dari SpecialType* @prop {number} [prop5=42] - properti number opsional dari SpecialType dengan nilai standar*//** @type {SpecialType} */varspecialTypeObject ;specialTypeObject .prop3 ;
Anda bisa menggunakan object
atau Object
pada baris pertama.
jsTry
/*** @typedef {object} SpecialType1 - buat tipe baru bernama 'SpecialType'* @property {string} prop1 - properti string dari SpecialType* @property {number} prop2 - properti number dari SpecialType* @property {number=} prop3 - opsional properti number dari SpecialType*//** @type {SpecialType1} */varspecialTypeObject1 ;
@params
memperbolehkan sintaks yang serupa untuk spesifikasi tipenya.
Perhatikan bahwa nama properti nested harus diawali dengan nama parameter-nya:
jsTry
/*** @param {Object} options - Bentuknya sama dengan SpecialType di atas* @param {string} options.prop1* @param {number} options.prop2* @param {number=} options.prop3* @param {number} [options.prop4]* @param {number} [options.prop5=42]*/functionspecial (options ) {return (options .prop4 || 1001) +options .prop5 ;}
@callback
mirip dengan @typedef
, tetapi ini menetapkan tipe fungsi daripada tipe objek:
jsTry
/*** @callback Predicate* @param {string} data* @param {number} [index]* @returns {boolean}*//** @type {Predicate} */constok = (s ) => !(s .length % 2);
Tentu saja, salah satu dari jenis ini dapat dideklarasikan menggunakan sintaks TypeScript dalam satu baris @typedef
:
js
/** @typedef {{ prop1: string, prop2: string, prop3?: number }} SpecialType *//** @typedef {(data: string, index?: number) => boolean} Predicate */
@template
Anda dapat mendeklarasikan fungsi generik dengan tag @template
:
jsTry
/*** @template T* @param {T} x - Parameter umum yang mengalir ke tipe kembalian* @return {T}*/functionid (x ) {returnx ;}consta =id ("string");constb =id (123);constc =id ({});
Gunakan koma atau beberapa tag untuk mendeklarasikan beberapa parameter tipe:
js
/*** @template T,U,V* @template W,X*/
Anda juga bisa menentukan batasan tipe sebelum nama parameter-nya. Hanya parameter tipe pertama dalam sebuah list yang dibatasi.
jsTry
/*** @template {string} K - K harus berupa string atau string literal* @template {{ serious(): string }} Seriousalizable - harus memiliki method serious* @param {K} key* @param {Seriousalizable} object*/functionseriousalize (key ,object ) {// ????}
Mendeklarasikan kelas generik atau tipe yang tidak didukung.
Classes
Kelas yang dapat dideklarasikan sebagai kelas ES6.
jsTry
classC {/*** @param {number} data*/constructor(data ) {// tipe properti yang bisa diketahuithis.name = "foo";// atau mengaturnya secara eksplisit/** @type {string | null} */this.title = null;// atau hanya diberi anotasi, jika disetel di tempat lain/** @type {number} */this.size ;this.initialize (data ); // Seharusnya galat, karena inisialisasi mengharapkan string}/*** @param {string} s*/initialize = function (s ) {this.size =s .length ;};}varc = newC (0);// C seharusnya hanya dipanggil dengan yang baru,// tetapi karena ini adalah JavaScript, ini// diperbolehkan dan dianggap sebagai 'any'.varresult =C (1);
Mereka juga dapat dideklarasikan sebagai fungsi konstruktor, seperti yang dijelaskan di bagian selanjutnya:
@constructor
Kompilator menyimpulkan fungsi konstruktor berdasarkan penetapan properti ini, tetapi Anda dapat membuat pemeriksaan lebih ketat dan saran lebih baik jika Anda menambahkan tag @constructor
:
jsTry
/*** @constructor* @param {number} data*/functionC (data ) {// tipe properti yang dapat diketahuithis.name = "foo";// atau atur secara eksplisit/** @type {string | null} */this.title = null;// atau hanya diberi anotasi, jika disetel di tempat lain/** @type {number} */this.size ;this.Argument of type 'number' is not assignable to parameter of type 'string'.2345Argument of type 'number' is not assignable to parameter of type 'string'.initialize (); data }/*** @param {string} s*/C .prototype .initialize = function (s ) {this.size =s .length ;};varc = newC (0);c .size ;varValue of type 'typeof C' is not callable. Did you mean to include 'new'?2348Value of type 'typeof C' is not callable. Did you mean to include 'new'?result =C (1);
Catatan: Pesan galat hanya tampil di basis kode JS dengan JSConfig dan
checkJS
yang diaktifkan.
Dengan @constructor
, this
diperiksa didalam fungsi konstruktor C
, jadi anda akan mendapatkan saran untuk method initialize
dan sebuah galat jika anda memasukkan sebuah angka. Editor-mu mungkin akan menampilkan peringatan jika memanggil C
daripada mengkonstruksikannya.
Sayangnya, ini berarti bahwa fungsi konstruktor yang juga dapat dipanggil tidak dapat menggunakan @constructor
.
@this
Kompilator biasanya dapat mengetahui tipe this
ketika ia memiliki beberapa konteks untuk dikerjakan. Jika tidak, Anda dapat secara eksplisit menentukan jenis this
dengan @this
:
jsTry
/*** @this {HTMLElement}* @param {*} e*/functioncallbackForLater (e ) {this.clientHeight =parseInt (e ); // seharusnya baik-baik saja!}
@extends
Ketika kelas JavaScript memperluas base class, tidak ada tempat untuk menentukan seharusnya menggunakan parameter tipe yang seperti apa. Tag @extends
menyediakan tempat untuk parameter jenis itu:
jsTry
/*** @template T* @extends {Set<T>}*/classSortableSet extendsSet {// ...}
Perhatikan bahwa @extends
hanya berfungsi dengan kelas. Saat ini, tidak ada cara untuk fungsi konstruktor memperluas kelas.
@enum
Tag @enum
memungkinkan Anda membuat literal objek yang tipe anggotanya spesifik. Tidak seperti kebanyakan literal objek di JavaScript, ini tidak mengizinkan anggota lain.
jsTry
/** @enum {number} */constJSDocState = {BeginningOfLine : 0,SawAsterisk : 1,SavingComments : 2,};JSDocState .SawAsterisk ;
Perhatikan bahwa @enum
sangat berbeda, dan jauh lebih sederhana daripada enum
TypeScript. Namun, tidak seperti enum TypeScript, @enum
dapat memiliki tipe apa saja:
jsTry
/** @enum {function(number): number} */constMathFuncs = {add1 : (n ) =>n + 1,id : (n ) => -n ,sub1 : (n ) =>n - 1,};MathFuncs .add1 ;
Lebih banyak contoh
jsTry
varsomeObj = {/*** @param {string} param1 - Dokumen tentang tugas properti*/x : function (param1 ) {},};/*** Seperti halnya dokumen tentang tugas variabel* @return {Window}*/letsomeFunc = function () {};/*** Dan method kelas* @param {string} greeting Salam untuk digunakan*/Foo .prototype .sayHi = (greeting ) =>console .log ("Hi!");/*** Dan ekspresi arrow function* @param {number} x - Pengganda*/letmyArrow = (x ) =>x *x ;/*** Artinya, ini juga berfungsi untuk komponen fungsi stateless di JSX* @param {{a: string, b: number}} test - Beberapa param*/varsfc = (test ) => <div >{test .a .charAt (0)}</div >;/*** Parameter bisa menjadi konstruktor kelas, menggunakan sintaks Closure.** @param {{new(...args: any[]): object}} C - Kelas untuk mendaftar*/functionregisterClass (C ) {}/*** @param {...string} p1 - A 'rest' arg (array) of strings. (treated as 'any')*/functionfn10 (p1 ) {}/*** @param {...string} p1 - A 'rest' arg (array) of strings. (treated as 'any')*/functionfn9 (p1 ) {returnp1 .join ();}
Pola yang diketahui TIDAK didukung
Mengacu pada objek di value space sebagai tipe yang tidak berfungsi, kecuali objek tersebut juga membuat tipe, seperti fungsi konstruktor.
jsTry
functionaNormalFunction () {}/*** @type {aNormalFunction}*/varwrong ;/*** Gunakan 'typeof' sebagai gantinya:* @type {typeof aNormalFunction}*/varright ;
Postfix sama dengan tipe properti dalam tipe literal objek yang tidak menetapkan properti opsional:
jsTry
/*** @type {{ a: string, b: number= }}*/varwrong ;/*** Gunakan postfix question pada nama properti sebagai gantinya:* @type {{ a: string, b?: number }}*/varright ;
Jenis Nullable hanya memiliki arti jika strictNullChecks
aktif:
jsTry
/*** @type {?number}* With strictNullChecks: true -- number | null* With strictNullChecks: false -- number*/varnullable ;
Anda juga bisa menggunakan tipe gabungan:
jsTry
/*** @type {number | null}* With strictNullChecks: true -- number | null* With strictNullChecks: false -- number*/varunionNullable ;
Tipe non-nullable tidak memiliki arti dan diperlakukan seperti jenis aslinya:
jsTry
/*** @type {!number}* Hanya bertipe number*/varnormal ;
Tidak seperti sistem tipe JSDoc, TypeScript hanya memungkinkan Anda untuk menandai tipe, apakah mengandung null atau tidak.
Tidak ada non-nullability eksplisit - jika strictNullChecks aktif, number
tidak dapat dinihilkan.
Jika tidak aktif, maka number
adalah nullable.
Tag yang tidak didukung
TypeScript mengabaikan semua tag JSDoc yang tidak didukung.
Tag berikut memiliki isu terbuka untuk mendukungnya:
@const
(issue #19672)@inheritdoc
(issue #23215)@memberof
(issue #7237)@yields
(issue #23857){@link …}
(issue #35524)
Extensi kelas JS
Modifier Property JSDoc
Dari TypeScript 3.8 dan seterusnya, Anda dapat menggunakan JSDoc untuk mengubah properti kelas. Pertama adalah pengubah aksesibilitas: @public
,@private
, dan @protected
.
Tag ini bekerja persis seperti public
,private
, dan protected
, masing-masing berfungsi di TypeScript.
jsTry
// @ts-checkclassCar {constructor() {/** @private */this.identifier = 100;}printIdentifier () {console .log (this.identifier );}}constc = newCar ();Property 'identifier' is private and only accessible within class 'Car'.2341Property 'identifier' is private and only accessible within class 'Car'.console .log (c .); identifier
@public
ini berarti properti dapat diakses dari mana saja.@private
berarti bahwa properti hanya dapat digunakan di dalam kelas yang memuatnya.@protected
berarti bahwa properti hanya dapat digunakan di dalam kelas penampung, dan semua subkelas turunan, tetapi tidak pada instance kelas penampung yang berbeda.
Selanjutnya, kita juga telah menambahkan modifier @readonly
untuk memastikan bahwa sebuah properti hanya dapat di-write selama inisialisasi.
jsTry
// @ts-checkclassCar {constructor() {/** @readonly */this.identifier = 100;}printIdentifier () {console .log (this.identifier );}}constc = newCar ();console .log (c .identifier );