Skip to content

Symbol 接口

Symbol(符号)是类型系统的命名实体。每个命名声明(变量、函数、类、接口等)都对应一个 Symbol。


Symbol

ts
interface Symbol {
  flags: SymbolFlags;
  escapedName: __String;
  declarations?: Declaration[];
  valueDeclaration?: Declaration;
  members?: SymbolTable;
  exports?: SymbolTable;
  globalExports?: SymbolTable;
}

属性

成员类型说明
flagsSymbolFlags符号分类标志位
escapedName__String内部转义名称(用于唯一标识,__前缀处理了关键字冲突)
declarationsDeclaration[]?该符号的所有声明节点(声明合并时有多个)
valueDeclarationDeclaration?主声明节点(值空间)
membersSymbolTable?成员符号表(类 / 接口成员)
exportsSymbolTable?导出符号表
globalExportsSymbolTable?全局导出(declare global
id @internalnumber唯一数字 ID(@internal,运行时存在但不在公开 API 中)
mergeId @internalnumber声明合并 ID(@internal
parent @internalSymbol?父符号(如类方法的父符号是类)(@internal

方法

方法签名说明
getName(): string非转义的名称字符串
getFlags(): SymbolFlags返回 flags
getEscapedName(): __String内部转义名
getDeclarations(): Declaration[] | undefined所有声明节点
getDocumentationComment(checker?): SymbolDisplayPart[]JSDoc 注释
getJsDocTags(checker?): JSDocTagInfo[]JSDoc 标签列表

SymbolFlags

SymbolFlags 是位掩码枚举,描述符号所在的语义空间。

基础标志

标志说明
None = 0
FunctionScopedVariablevar / 函数参数
BlockScopedVariablelet / const
Property属性(对象 / 类)
EnumMember枚举成员
Function函数
Classclass
Interfaceinterface
ConstEnumconst enum
RegularEnum普通 enum
ValueModule值命名空间(module / namespace
NamespaceModule纯类型命名空间
TypeLiteral匿名类型字面量
ObjectLiteral对象字面量
Method方法
Constructor构造函数
GetAccessorgetter
SetAccessorsetter
Signature调用 / 构造签名
TypeParameter类型参数
TypeAliastype 别名
ExportValue导出的值
Aliasimport / export 别名
Prototypeprototype 属性
ExportStarexport * 声明
Optional可选成员(?
Transient临时符号(编译器内部)
Assignment赋值模式(JS)
Deprecated已弃用

复合标志

标志等价说明
VariableFunctionScopedVariable | BlockScopedVariable变量
ValueVariable | Property | EnumMember | ...值空间符号
TypeClass | Interface | Enum | TypeAlias | TypeParameter | ...类型空间符号
NamespaceValueModule | NamespaceModule | Enum命名空间
HasExportsClass | Enum | Module有导出
HasMembersClass | Interface | TypeLiteral | ObjectLiteral有成员
AccessorGetAccessor | SetAccessor访问器
ClassifiableClass | Enum | TypeAlias | Interface | TypeParameter | Module | Alias可分类
EnumRegularEnum | ConstEnum所有枚举
ModuleValueModule | NamespaceModule所有模块
ModuleMember模块内允许的成员类型
ExportHasLocal导出且有局部实录
BlockScopedBlockScopedVariable | Class | Enum块作用域绑定
PropertyOrAccessorProperty | GetAccessor | SetAccessor属性或访问器
ClassMemberMethod | Accessor | Property类成员
All-1所有标志

Excludes 系列(声明冲突检测)

Excludes 标志用于声明合并阶段,表示“某种符号不允许与哪些其他符号共存”。一般不直接使用。

标志说明
FunctionScopedVariableExcludesvar 声明不能与哪些符号共存
BlockScopedVariableExcludeslet/const 不能与任何其他值符号共存
ParameterExcludes参数不能与任何其他值符号共存
PropertyExcludes属性无冲突限制
EnumMemberExcludes枚举成员的共存限制
FunctionExcludes函数的共存限制
ClassExcludesclass 的共存限制
InterfaceExcludesinterface 的共存限制(可合并)
RegularEnumExcludes普通 enum 的共存限制
ConstEnumExcludesconst enum 的共存限制
ValueModuleExcludesmodule/namespace 的共存限制
NamespaceModuleExcludes纯类型命名空间无冲突限制
MethodExcludes方法的共存限制
GetAccessorExcludesgetter 的共存限制
SetAccessorExcludessetter 的共存限制
AccessorExcludes访问器通用共存限制
TypeParameterExcludes类型参数的共存限制
TypeAliasExcludestype 别名的共存限制
AliasExcludes导入别名的共存限制

SymbolTable

ts
// SymbolTable 是 Map<__String, Symbol> 的类型别名
type SymbolTable = Map<__String, Symbol>;

常见访问方式

ts
// 获取模块的所有导出符号
const exports = checker.getExportsOfModule(moduleSymbol); // Symbol[]

// 按名称查成员(注意 escapedName 转换)
const member = symbol.members?.get('methodName' as ts.__String);

// 遍历所有成员
symbol.members?.forEach((sym, name) => {
  console.log(ts.unescapeLeadingUnderscores(name), sym.flags);
});

名称转义规则

TypeScript 内部对标识符名称有转义处理(__String),以避免与 JavaScript 内建属性冲突:

原名转义后
constructor__constructor
toString__toString
普通名称不变

使用 ts.escapeLeadingUnderscores(name)ts.unescapeLeadingUnderscores(escapedName) 互转。


SymbolDisplayPart

ts
interface SymbolDisplayPart {
  text: string;
  kind: string;  // 语义分类
}

kind 取值

kind说明
keyword关键字(constinterface…)
text普通文本
punctuation标点({}()…)
space空格
operator运算符(:=>…)
aliasName别名
className类名
enumName枚举名
fieldName字段名
functionName函数名
interfaceName接口名
localName局部名
methodName方法名
moduleName模块名
parameterName参数名
propertyName属性名
stringLiteral字符串字面量
typeParameterName类型参数名
typeAliasName类型别名名
symbol符号名
lineBreak换行符
link链接(JSDoc {@link}
linkName链接名
linkText链接文本

拼接示例

ts
const info = checker.getQuickInfoAtPosition(fileName, pos);
const typeText = info?.displayParts?.map(p => p.text).join('') ?? '';

JSDocTagInfo

ts
interface JSDocTagInfo {
  name: string;                          // 标签名(不含 @)
  text: SymbolDisplayPart[] | undefined; // 标签内容部件
}

示例

ts
/** @param value 要处理的值 @returns 处理结果 */
function process(value: string): string { ... }

const sym = checker.getSymbolAtLocation(fnNode)!;
const tags = sym.getJsDocTags(checker);
// tags[0] = { name: 'param', text: [{ text: 'value', kind: 'parameterName' }, ...] }
// tags[1] = { name: 'returns', text: [{ text: '处理结果', kind: 'text' }] }