microsoft / microsoft/TypeScript

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

Ouverte
#54,879 6 commentaires 4 réactions 1 personne assignée Voir sur GitHub

@weswigham y travaille déjà.

Depuis le 7/7/2023.

Needs Investigation Rescheduled
Langage dominant
Go
Étoiles
111k
Forks
14.4k
Merge moyen
1 j 19 h
PR mergées (30 j)
117

Description

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!

Guide de contribution

Ouvrir le guide de contribution

Par où commencer

  1. Lisez l'issue en entier, puis le guide de contribution du projet.
  2. Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
  3. Forkez le dépôt et travaillez sur une branche.
  4. Ouvrez une pull request qui référence le numéro de l'issue.

Évaluation

Cette issue n'a pas encore été évaluée.

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.