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.

貢獻者指南