JSDoc 类型定义 #
基本类型 #
JavaScript 原始类型 #
javascript
/**
* @type {string} 字符串类型
*/
let name = 'John';
/**
* @type {number} 数字类型
*/
let age = 25;
/**
* @type {boolean} 布尔类型
*/
let isActive = true;
/**
* @type {null} null 类型
*/
let empty = null;
/**
* @type {undefined} undefined 类型
*/
let notDefined = undefined;
/**
* @type {symbol} Symbol 类型
*/
let uniqueId = Symbol('id');
/**
* @type {bigint} BigInt 类型
*/
let bigNumber = 9007199254740991n;
特殊类型 #
javascript
/**
* @type {*} 任意类型
*/
let anything = 'any value';
/**
* @type {void} 无返回值
*/
function log(message) {
console.log(message);
}
/**
* @type {never} 永不返回
*/
function throwError(message) {
throw new Error(message);
}
/**
* @type {object} 对象类型
*/
let config = { timeout: 5000 };
/**
* @type {function} 函数类型
*/
let callback = () => {};
数组类型 #
基本数组 #
javascript
/**
* 字符串数组
* @type {string[]}
*/
let names = ['John', 'Jane', 'Bob'];
/**
* 数字数组
* @type {number[]}
*/
let scores = [90, 85, 95];
/**
* 使用 Array 泛型
* @type {Array<string>}
*/
let tags = ['js', 'node', 'react'];
多维数组 #
javascript
/**
* 二维数组
* @type {number[][]}
*/
let matrix = [
[1, 2, 3],
[4, 5, 6]
];
/**
* 三维数组
* @type {string[][][]}
*/
let cube = [[['a', 'b'], ['c']], [['d']]];
混合类型数组 #
javascript
/**
* 混合类型数组
* @type {Array<string|number>}
*/
let mixed = ['hello', 42, 'world', 100];
/**
* 元组风格(固定长度和类型)
* @type {[string, number, boolean]}
*/
let tuple = ['John', 25, true];
对象类型 #
基本对象 #
javascript
/**
* 简单对象
* @type {Object}
*/
let user = { name: 'John', age: 25 };
/**
* 带属性类型的对象
* @type {Object<string, number>}
*/
let scores = { math: 90, english: 85 };
对象属性定义 #
javascript
/**
* @typedef {Object} User
* @property {string} name - 用户名
* @property {number} age - 年龄
* @property {string} [email] - 邮箱(可选)
* @property {string[]} [tags=[]] - 标签数组
*/
/**
* @type {User}
*/
const user = {
name: 'John',
age: 25,
email: 'john@example.com',
tags: ['developer', 'admin']
};
嵌套对象 #
javascript
/**
* @typedef {Object} Address
* @property {string} city - 城市
* @property {string} street - 街道
* @property {number} zipCode - 邮编
*/
/**
* @typedef {Object} User
* @property {string} name - 用户名
* @property {Address} address - 地址对象
*/
/**
* @type {User}
*/
const user = {
name: 'John',
address: {
city: 'Beijing',
street: 'Main Street',
zipCode: 100000
}
};
索引签名 #
javascript
/**
* 字符串键,数字值
* @type {Object<string, number>}
*/
const scores = { math: 90, english: 85 };
/**
* 数字键,字符串值
* @type {Object<number, string>}
*/
const indexMap = { 0: 'first', 1: 'second' };
/**
* 任意键,任意值
* @type {Object<string, *>}
*/
const cache = {};
函数类型 #
基本函数 #
javascript
/**
* @type {Function}
*/
let callback = () => {};
/**
* @type {function}
*/
let handler = function() {};
函数签名 #
javascript
/**
* 简单函数签名
* @type {function(string): boolean}
*/
const isValid = (str) => str.length > 0;
/**
* 多参数函数
* @type {function(number, number): number}
*/
const add = (a, b) => a + b;
/**
* 无参数函数
* @type {function(): void}
*/
const logTime = () => console.log(Date.now());
回调函数类型 #
javascript
/**
* @callback RequestCallback
* @param {Error|null} error - 错误对象
* @param {Object} [data] - 响应数据
* @returns {void}
*/
/**
* 发送请求
* @param {string} url - 请求地址
* @param {RequestCallback} callback - 回调函数
*/
function request(url, callback) {
// ...
}
函数重载 #
javascript
/**
* 处理输入
* @param {string} input - 字符串输入
* @returns {string}
* @overload
*/
/**
* 处理输入
* @param {number} input - 数字输入
* @returns {number}
* @overload
*/
/**
* 处理输入
* @param {string|number} input - 输入值
* @returns {string|number}
*/
function process(input) {
return input;
}
联合类型 #
基本联合类型 #
javascript
/**
* 字符串或数字
* @type {string|number}
*/
let id = '123';
id = 123;
/**
* 多种类型联合
* @type {string|number|boolean}
*/
let value = 'hello';
value = 42;
value = true;
可空类型 #
javascript
/**
* 可能为 null
* @type {?string}
*/
let name = 'John';
name = null;
// 等价于
/**
* @type {string|null}
*/
let name2 = 'John';
/**
* 可能为 undefined
* @type {string|undefined}
*/
let email = undefined;
字面量联合类型 #
javascript
/**
* 状态类型
* @typedef {'pending' | 'active' | 'inactive'} Status
*/
/**
* @type {Status}
*/
let status = 'active';
/**
* 方向类型
* @typedef {'up' | 'down' | 'left' | 'right'} Direction
*/
/**
* @type {Direction}
*/
let direction = 'up';
交叉类型 #
基本交叉类型 #
javascript
/**
* @typedef {Object} Name
* @property {string} name
*/
/**
* @typedef {Object} Age
* @property {number} age
*/
/**
* 交叉类型
* @typedef {Name & Age} Person
*/
/**
* @type {Person}
*/
const person = {
name: 'John',
age: 25
};
合并对象类型 #
javascript
/**
* @typedef {Object} BaseConfig
* @property {string} baseURL - 基础地址
*/
/**
* @typedef {Object} RequestOptions
* @property {number} [timeout] - 超时时间
*/
/**
* 合并配置类型
* @typedef {BaseConfig & RequestOptions} Config
*/
/**
* @type {Config}
*/
const config = {
baseURL: '/api',
timeout: 5000
};
泛型类型 #
基本泛型 #
javascript
/**
* 泛型函数
* @template T
* @param {T} value - 输入值
* @returns {T} 返回相同类型
*/
function identity(value) {
return value;
}
/**
* 多个泛型参数
* @template T, U
* @param {T} first - 第一个值
* @param {U} second - 第二个值
* @returns {Object} 包含两个值的对象
*/
function pair(first, second) {
return { first, second };
}
泛型约束 #
javascript
/**
* 带约束的泛型
* @template {Object} T
* @param {T} obj - 对象参数
* @param {string} key - 键名
* @returns {*} 属性值
*/
function getProperty(obj, key) {
return obj[key];
}
泛型数组 #
javascript
/**
* 数组工具
* @template T
* @param {T[]} items - 数组
* @param {function(T): boolean} predicate - 条件函数
* @returns {T[]} 过滤后的数组
*/
function filter(items, predicate) {
return items.filter(predicate);
}
泛型类 #
javascript
/**
* 泛型容器类
* @template T
*/
class Container {
/**
* @param {T} value - 初始值
*/
constructor(value) {
/**
* @type {T}
*/
this.value = value;
}
/**
* @returns {T}
*/
getValue() {
return this.value;
}
/**
* @param {T} value - 新值
*/
setValue(value) {
this.value = value;
}
}
泛型默认值 #
javascript
/**
* @template [T=string]
* @param {T} value - 输入值
* @returns {T}
*/
function process(value) {
return value;
}
类型别名 #
@typedef 定义类型 #
javascript
/**
* 用户类型
* @typedef {Object} User
* @property {number} id - 用户 ID
* @property {string} name - 用户名
* @property {string} email - 邮箱
* @property {string[]} [roles] - 角色列表
*/
/**
* @param {User} user - 用户对象
*/
function saveUser(user) {
// ...
}
复杂类型别名 #
javascript
/**
* API 响应类型
* @template T
* @typedef {Object} ApiResponse
* @property {number} code - 状态码
* @property {string} message - 消息
* @property {T} [data] - 数据
*/
/**
* @returns {Promise<ApiResponse<User>>}
*/
async function fetchUser() {
// ...
}
类型引用 #
javascript
/**
* @typedef {import('./types').User} User
* @typedef {import('./types').Config} Config
*/
/**
* @param {User} user
* @param {Config} config
*/
function init(user, config) {
// ...
}
类型断言 #
类型强制 #
javascript
/**
* 强制类型断言
* @type {string}
*/
// @ts-ignore
const value = someValue;
类型守卫 #
javascript
/**
* 检查是否为字符串
* @param {*} value - 任意值
* @returns {value is string}
*/
function isString(value) {
return typeof value === 'string';
}
/**
* 检查是否为用户对象
* @param {*} obj - 任意对象
* @returns {obj is User}
*/
function isUser(obj) {
return obj && typeof obj.name === 'string';
}
类型导入导出 #
导入类型 #
javascript
/**
* 从模块导入类型
* @typedef {import('./user').User} User
* @typedef {import('./config').Config} Config
*/
/**
* 导入并重命名
* @typedef {import('./api').Response as ApiResponse} ApiResponse
*/
导出类型 #
javascript
/**
* 用户模块
* @module user
*/
/**
* @typedef {Object} User
* @property {string} name - 用户名
* @property {number} age - 年龄
*/
export { User };
类型复用 #
javascript
/**
* 基础用户类型
* @typedef {Object} BaseUser
* @property {string} name - 用户名
* @property {string} email - 邮箱
*/
/**
* 扩展用户类型
* @typedef {BaseUser & {
* id: number,
* createdAt: Date
* }} FullUser
*/
类型工具 #
Partial 类型 #
javascript
/**
* 部分属性
* @typedef {Partial<User>} PartialUser
*/
/**
* @param {PartialUser} updates - 更新数据
*/
function updateUser(updates) {
// ...
}
Required 类型 #
javascript
/**
* 所有属性必需
* @typedef {Required<User>} RequiredUser
*/
Pick 类型 #
javascript
/**
* 选择部分属性
* @typedef {Pick<User, 'name' | 'email'>} UserContact
*/
Omit 类型 #
javascript
/**
* 排除部分属性
* @typedef {Omit<User, 'id'>} NewUser
*/
Record 类型 #
javascript
/**
* 记录类型
* @typedef {Record<string, number>} ScoreMap
*/
/**
* @type {ScoreMap}
*/
const scores = { math: 90, english: 85 };
类型兼容性 #
TypeScript 兼容 #
JSDoc 类型与 TypeScript 完全兼容:
javascript
/**
* @typedef {Object} User
* @property {string} name
* @property {number} age
*/
// 在 .ts 文件中可以直接使用
// import { User } from './user.js';
类型推断 #
javascript
/**
* JSDoc 会自动推断一些类型
*/
class User {
constructor(name) {
// 自动推断为 string
this.name = name;
}
getName() {
// 自动推断返回 string
return this.name;
}
}
类型最佳实践 #
使用具体类型 #
javascript
// ✅ 好的做法
/**
* @type {string[]}
*/
// ❌ 避免
/**
* @type {Array}
*/
避免过度使用 any #
javascript
// ✅ 好的做法
/**
* @param {string|number} value
*/
// ❌ 避免
/**
* @param {*} value
*/
使用类型别名 #
javascript
// ✅ 好的做法
/**
* @typedef {Object} User
* @property {string} name
* @property {number} age
*/
/**
* @param {User} user
*/
// ❌ 重复定义
/**
* @param {Object} user
* @param {string} user.name
* @param {number} user.age
*/
下一步 #
现在你已经掌握了 JSDoc 类型系统,接下来学习 常用标签 了解更多文档标签!
最后更新:2026-03-29