microsoft / microsoft/TypeScript

A function that returns a class with a property getter is unusable via a declaration file (TS2611)

オープン
#54,879 コメント 6 件 リアクション 4 件 担当者 1 名 GitHub で見る

@weswigham がすでに取り組んでいます。

2023年7月7日 から。

Needs Investigation Rescheduled
主要言語
Go
スター
111k
フォーク
14.4k
平均マージ
1日 19時間
マージ済み PR(30日)
117

説明

Bug Report

🔎 Search Terms

TS2611, declaration file, property getter

🕗 Version & Regression Information
  • This is the behavior in every version I tried, and I reviewed the FAQ for entries about TS2611, declaration files, property getters
⏯ Playground Link

This can't be completely reproduced in the Playground because it requires two separate projects. One to produce a .d.ts and another to attempt (and fail) to use it.

💻 Code

Complete and minimal code sample here: https://github.com/kring/ts2611-in-decl-files
You can reproduce it by cloning that repo and running npm install && npm run build.

To recreate it manually, define two projects, a and b, and use project references to link them up. Project a exports a class which is created by deriving from a class returned by a function, like this:

function functionReturningClass() {
  return class ClassInsideFunction {
    get r() {
      return 7;
    }
  };
}

class Something extends functionReturningClass() {
  override get r() {
    return 8;
  }
}

export default Something;

(The above is in https://github.com/kring/ts2611-in-decl-files/blob/main/a/something.ts)

Now if we add another module that uses this to the same project, then it works great:

import Something from "./something.js";

const d = new Something();
console.log(d.r);

(the above is in https://github.com/kring/ts2611-in-decl-files/blob/main/a/use-from-a.ts)

However, if we add identical code to another project that references this one, like this, then it no longer works anymore:

import Something from "../a/something.js";

const d = new Something();
console.log(d.r);

(the above is from https://github.com/kring/ts2611-in-decl-files/blob/main/b/use-from-b.ts)

🙁 Actual behavior

TypeScript reports the following:

out/a/something.d.ts:7:9 - error TS2611: 'r' is defined as a property in class '{ readonly r: number; }', but is overridden here in 'Something' as an accessor.

7     get r(): number;
          ~

This happens because the generated .d.ts does in fact mix properties and accessors:

declare const Something_base: {
    new (): {
        readonly r: number;
    };
};
declare class Something extends Something_base {
    get r(): number;
}
export default Something;

As far as I can tell, this makes the generated .d.ts file unusable.

🙂 Expected behavior

I expected no compiler error, probably because the TS compiler emitted an accessor in Something_base rather than a property. Or maybe because it didn't get hung on the mismatch in this scenario?

This was also previously observed here:
https://github.com/microsoft/TypeScript/issues/41347#issuecomment-919256478

Thank you for taking a look!

コントリビューションガイド

コントリビューションガイドを開く

はじめの一歩

  1. issue を最後まで読み、次にプロジェクトのコントリビューションガイドを読みます。
  2. 着手することを issue にコメントします — 二人が同じ作業をするのを防げます。
  3. リポジトリをフォークし、ブランチを切って変更します。
  4. issue 番号を参照したプルリクエストを送ります。

評価

この issue はまだ評価されていません。

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。