Microsoft/TypeScript

Types intersected with string literal or 'unique symbol' error on computed property name declaration but only if it's abstract.

Open

#54,335 创建于 2023年5月21日

在 GitHub 查看
 (6 评论) (0 反应) (0 负责人)TypeScript (6,726 fork)batch import
BugDomain: IntersectionHelp Wanted

仓库指标

Star
 (48,455 star)
PR 合并指标
 (平均合并 6天 17小时) (30 天内合并 9 个 PR)

描述

Bug Report

In the following code:

declare const aStringLiteral: 'string literal';

declare const aUniqueSymbol: unique symbol;

interface Whatever { p: any }

declare const objectWithToString: Whatever & typeof aStringLiteral;

declare const objectWithToPrimitiveSymbol: Whatever & typeof aUniqueSymbol;

objectWithToString and objectWithToPrimitiveSymbol are indeed of type string literal and 'unique symbol' respectively. So this expectedly works

class TestClass {
  [objectWithToString]() {} // works 🎉
  [objectWithToPrimitiveSymbol]() {} // works 🎉
}

But this fails, and the error message says the types aren't, even though they are.

abstract class TestAbstractClass {
  // Error: A computed property name in a method overload must refer to an expression whose type is a literal type or a 'unique symbol' type.(1168)
  abstract [objectWithToString](): void; // but IT IS a string literal type 🐛

  // Error: A computed property name in a method overload must refer to an expression whose type is a literal type or a 'unique symbol' type.(1168)
  abstract [objectWithToPrimitiveSymbol](): void; // but IT IS a 'unique symbol' 🐛
}

🔎 Search Terms

computed property abstract string literal type unique symbol

🕗 Version & Regression Information

⏯ Playground Link

Playground link with relevant code

💻 Code

In the description

🙁 Actual behavior

Works for non-abstract methods but fails for abstract methods.

🙂 Expected behavior

Should work for both kind of methods.

贡献者指南