microsoft / microsoft/TypeScript

Allow class inheritance in ambient contexts, even with a base private constructor

Ouverte
#18,283 7 commentaires 2 réactions 0 personnes assignées Voir sur GitHub

Personne n'a encore pris cette issue.

Committed Help Wanted Suggestion
Langage dominant
Go
Étoiles
111k
Forks
14.3k
Merge moyen
2 j 4 h
PR mergées (30 j)
132

Description

TypeScript Version: nightly (2.5.0-dev.20170902)

Code

declare namespace Foo {
    class Bar {
        private constructor();
        Box: string;
    }
    class Baz extends Bar {
        private constructor();
    }
    function generator(): Baz;
}

let x = Foo.generator();
x.Box = 'abcd';

Expected behavior:
Compile without error.

Actual behavior:
error TS2675: Cannot extend a class 'Foo.Bar'. Class constructor is marked as private.

Use case
This would allow declaring the types of host-supplied objects, with the following features:

  1. can inherit members from each other
  2. cannot be inherited from using standard Typescript/Javascript classes
  3. cannot be assigned to from an object literal with matching members
  4. cannot be constructed, only returned from a factory method
declare namespace com.sun.star.text {
    class XTextTablesSupplier {
        private constructor();
        private typekey: XTextTablesSupplier;
        readonly TextTables: any;
    }
    class GenericTextDocument extends XTextTablesSupplier {
        private constructor();
        private typekey1: GenericTextDocument;
        CharacterCount: number;
    }
}
declare function createInstance(typename: 'com.sun.star.text.GenericTextDocument'): com.sun.star.text.GenericTextDocument;

let x = createInstance('com.sun.star.text.GenericTextDocument'); // OK

x = new com.sun.star.text.GenericTextDocument(); // Error

let y = x.TextTables; // OK

// The following would be an error
x = {
    TextTables: '',
    CharacterCount: 5
};

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.

Piste de recherche

Commencez par compiler l’exemple d’espace de noms ambient de l’issue avec le comportement nocturne de TypeScript référencé. Suivez le diagnostic du checker pour l’extension de Foo.Bar et comparez-le avec l’acceptation attendue de la déclaration. C’est terminé lorsque l’exemple se compile, tandis que la construction et l’affectation d’un littéral d’objet restent en erreur.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
typescript
Domaine
compilers
Type d'issue
Fonctionnalité
Difficulté
4/5
Temps estimé
3-5 jours
Activité
À l'abandon
Clarté
Clairement spécifiée
Accessibilité débutants
35/100

Recevez les nouvelles issues par e-mail

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