Microsoft/TypeScript

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

Open

#18,283 创建于 2017年9月6日

在 GitHub 查看
 (7 评论) (2 反应) (0 负责人)TypeScript (48,455 star) (6,726 fork)batch import
CommittedHelp WantedSuggestion

描述

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
};

贡献者指南