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 opened on 2023年5月21日

GitHub で見る
 (6 comments) (0 reactions) (0 assignees)TypeScript (6,726 forks)batch import
BugDomain: IntersectionHelp Wanted

Repository metrics

Stars
 (48,455 stars)
PR merge metrics
 (平均マージ 6d 17h) (30d で 9 merged PRs)

説明

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.

コントリビューターガイド