元素隐式具有“任何”类型

Est*_*ask 5 symbols typescript

这个演示使typeof Symbol.toStringTag类型symbol

const promise = Promise.resolve();
const toStr: typeof Symbol.toStringTag | void = typeof Symbol === 'function' ? Symbol.toStringTag : undefined;

if (toStr) {
    console.log(promise[toStr] === 'Promise');
}
Run Code Online (Sandbox Code Playgroud)

并导致错误:

元素隐式具有 'any' 类型,因为类型 'symbol' 的表达式不能用于索引类型 'Promise'。(7053)

有没有办法缩小toStr符号类型而不是明确使用符号promise[Symbol.toStringTag]

dan*_*nvk 1

正如您所注意到的,typeof Symbol.toStringTag只是symbol,这对于您的目的来说不够具体。类型更具体,但我相信它仅适用于用户定义的符号unique symbol

使用访问器函数而不是存储符号是否可以满足您的需求?

const promise = Promise.resolve();

interface StringTaggable {
  readonly [Symbol.toStringTag]: string;
}

const toStringTag =
  typeof Symbol === 'function' ? (o: StringTaggable) => o[Symbol.toStringTag] : undefined;

if (toStringTag) {
    console.log(toStringTag(promise) === 'Promise');
}
Run Code Online (Sandbox Code Playgroud)