File: constructSignatureAssignabilityInInheritance.errors.txt

package info (click to toggle)
node-typescript 4.9.5%2Bds1-2
  • links: PTS, VCS
  • area: main
  • in suites: sid, trixie
  • size: 533,908 kB
  • sloc: javascript: 2,018,330; makefile: 7; sh: 1
file content (90 lines) | stat: -rw-r--r-- 3,678 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance.ts(61,15): error TS2430: Interface 'I2' incorrectly extends interface 'Base2'.
  The types returned by 'new a(...)' are incompatible between these types.
    Type 'string' is not assignable to type 'number'.
tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance.ts(67,15): error TS2430: Interface 'I3' incorrectly extends interface 'Base2'.
  The types returned by 'new a2(...)' are incompatible between these types.
    Type 'string' is not assignable to type 'T'.
      'T' could be instantiated with an arbitrary type which could be unrelated to 'string'.


==== tests/cases/conformance/types/typeRelationships/assignmentCompatibility/constructSignatureAssignabilityInInheritance.ts (2 errors) ====
    // Checking basic subtype relations with construct signatures
    
    module ConstructSignature {
        interface Base { // T
            // M's
            new (x: number): void; // BUG 842221
            new (x: number, y: number): number;
        }
    
        // S's
        interface I extends Base {
            // N's
            new (x: number): number; // satisfies subtype for both of base's call signatures
            new (x: number, y: number): boolean; // so this one hides the base type member that is identical modulo return types
        }
    
        interface Base2 { // T
            // M's
            new (x: number): number;
        }
    
        // S's
        interface I2 extends Base2 {
            // N's
            new (x: number): string; // error because return types don't match
        }
    
        // S's
        interface I3 extends Base2 {
            // N's
            new <T>(x: T): string; // ok, adds a new call signature
        }
    }
    
    module MemberWithConstructSignature {
        interface Base { // T
            // M's
            a: new (x: number) => void;
            a2: new (x: number, y: number) => void;
            a3: new <T>(x: T) => void;
        }
    
        var b: Base;
        var r = new b.a(1);
    
        // S's
        interface I extends Base {
            // N's
            a: new (x: number) => number; // ok because base returns void
            a2: new (x: number, y: number) => boolean; // ok because base returns void
            a3: new <T>(x: T) => string; // ok because base returns void
        }
    
        interface Base2 { // T
            // M's
            a: new (x: number) => number;
            a2: new <T>(x: T) => T;
        }
    
        // S's
        interface I2 extends Base2 {
                  ~~
!!! error TS2430: Interface 'I2' incorrectly extends interface 'Base2'.
!!! error TS2430:   The types returned by 'new a(...)' are incompatible between these types.
!!! error TS2430:     Type 'string' is not assignable to type 'number'.
            // N's
            a: new (x: number) => string; // error because base returns non-void;
        }
    
        // S's
        interface I3 extends Base2 {
                  ~~
!!! error TS2430: Interface 'I3' incorrectly extends interface 'Base2'.
!!! error TS2430:   The types returned by 'new a2(...)' are incompatible between these types.
!!! error TS2430:     Type 'string' is not assignable to type 'T'.
!!! error TS2430:       'T' could be instantiated with an arbitrary type which could be unrelated to 'string'.
            // N's
            a2: new <T>(x: T) => string; // error because base returns non-void;
        }
    }