mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-03-15 14:05:47 -05:00
PR feedback
This commit is contained in:
@@ -5368,22 +5368,17 @@ module ts {
|
||||
}
|
||||
}
|
||||
}
|
||||
// Target type is type of constructor signiture
|
||||
// Target type is type of construct signature
|
||||
let constructSignatures: Signature[];
|
||||
if (rightType.flags & TypeFlags.Interface) {
|
||||
constructSignatures = (<InterfaceTypeWithDeclaredMembers>rightType).declaredConstructSignatures;
|
||||
constructSignatures = resolveDeclaredMembers(<InterfaceType>rightType).declaredConstructSignatures;
|
||||
}
|
||||
else if (rightType.flags & TypeFlags.Anonymous) {
|
||||
constructSignatures = (<ResolvedType>rightType).constructSignatures;
|
||||
constructSignatures = getSignaturesOfType(rightType, SignatureKind.Construct);
|
||||
}
|
||||
|
||||
if (constructSignatures) {
|
||||
let instanceType = getUnionType(map(constructSignatures, constructSignature => {
|
||||
if (constructSignature.typeParameters && constructSignature.typeParameters.length !== 0) {
|
||||
constructSignature = instantiateSignature(constructSignature, createTypeMapper(constructSignature.typeParameters, map(constructSignature.typeParameters, _ => anyType)), true)
|
||||
}
|
||||
return constructSignature.resolvedReturnType;
|
||||
}));
|
||||
if (constructSignatures && constructSignatures.length !== 0) {
|
||||
let instanceType = getUnionType(map(constructSignatures, signature => getReturnTypeOfSignature(getErasedSignature(signature))));
|
||||
// Pickup type from union types
|
||||
if (type.flags & TypeFlags.Union) {
|
||||
return getUnionTypeOfSubtypeConstituents(<UnionType>type, instanceType);
|
||||
|
||||
@@ -1,220 +1,220 @@
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(12,10): error TS2339: Property 'bar' does not exist on type 'A'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(33,5): error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(34,10): error TS2339: Property 'bar' does not exist on type 'B<number>'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(63,10): error TS2339: Property 'bar2' does not exist on type 'C1'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(82,10): error TS2339: Property 'bar' does not exist on type 'D'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(109,10): error TS2339: Property 'bar2' does not exist on type 'E1'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(131,11): error TS2339: Property 'foo' does not exist on type 'string | F'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(132,11): error TS2339: Property 'bar' does not exist on type 'string | F'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(157,11): error TS2339: Property 'foo2' does not exist on type 'G1'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(179,11): error TS2339: Property 'bar' does not exist on type 'H'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts (10 errors) ====
|
||||
interface AConstructor {
|
||||
new (): A;
|
||||
}
|
||||
interface A {
|
||||
foo: string;
|
||||
}
|
||||
declare var A: AConstructor;
|
||||
|
||||
var obj1: A | string;
|
||||
if (obj1 instanceof A) { // narrowed to A.
|
||||
obj1.foo;
|
||||
obj1.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'A'.
|
||||
}
|
||||
|
||||
var obj2: any;
|
||||
if (obj2 instanceof A) { // can't type narrowing from any.
|
||||
obj2.foo;
|
||||
obj2.bar;
|
||||
}
|
||||
|
||||
// a construct signature with generics
|
||||
interface BConstructor {
|
||||
new <T>(): B<T>;
|
||||
}
|
||||
interface B<T> {
|
||||
foo: T;
|
||||
}
|
||||
declare var B: BConstructor;
|
||||
|
||||
var obj3: B<number> | string;
|
||||
if (obj3 instanceof B) { // narrowed to B<number>.
|
||||
obj3.foo = 1;
|
||||
obj3.foo = "str";
|
||||
~~~~~~~~
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
obj3.bar = "str";
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'B<number>'.
|
||||
}
|
||||
|
||||
var obj4: any;
|
||||
if (obj4 instanceof B) { // can't type narrowing from any.
|
||||
obj4.foo = "str";
|
||||
obj4.foo = 1;
|
||||
obj4.bar = "str";
|
||||
}
|
||||
|
||||
// has multiple construct signature
|
||||
interface CConstructor {
|
||||
new (value: string): C1;
|
||||
new (value: number): C2;
|
||||
}
|
||||
interface C1 {
|
||||
foo: string;
|
||||
bar1: number;
|
||||
}
|
||||
interface C2 {
|
||||
foo: string;
|
||||
bar2: number;
|
||||
}
|
||||
declare var C: CConstructor;
|
||||
|
||||
var obj5: C1 | A;
|
||||
if (obj5 instanceof C) { // narrowed to C1.
|
||||
obj5.foo;
|
||||
obj5.bar1;
|
||||
obj5.bar2;
|
||||
~~~~
|
||||
!!! error TS2339: Property 'bar2' does not exist on type 'C1'.
|
||||
}
|
||||
|
||||
var obj6: any;
|
||||
if (obj6 instanceof C) { // can't type narrowing from any.
|
||||
obj6.foo;
|
||||
obj6.bar1;
|
||||
obj6.bar2;
|
||||
}
|
||||
|
||||
// with object type literal
|
||||
interface D {
|
||||
foo: string;
|
||||
}
|
||||
declare var D: { new (): D; };
|
||||
|
||||
var obj7: D | string;
|
||||
if (obj7 instanceof D) { // narrowed to D.
|
||||
obj7.foo;
|
||||
obj7.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'D'.
|
||||
}
|
||||
|
||||
var obj8: any;
|
||||
if (obj8 instanceof D) { // can't type narrowing from any.
|
||||
obj8.foo;
|
||||
obj8.bar;
|
||||
}
|
||||
|
||||
// a construct signature that returns a union type
|
||||
interface EConstructor {
|
||||
new (): E1 | E2;
|
||||
}
|
||||
interface E1 {
|
||||
foo: string;
|
||||
bar1: number;
|
||||
}
|
||||
interface E2 {
|
||||
foo: string;
|
||||
bar2: number;
|
||||
}
|
||||
declare var E: EConstructor;
|
||||
|
||||
var obj9: E1 | A;
|
||||
if (obj9 instanceof E) { // narrowed to E1.
|
||||
obj9.foo;
|
||||
obj9.bar1;
|
||||
obj9.bar2;
|
||||
~~~~
|
||||
!!! error TS2339: Property 'bar2' does not exist on type 'E1'.
|
||||
}
|
||||
|
||||
var obj10: any;
|
||||
if (obj10 instanceof E) { // can't type narrowing from any.
|
||||
obj10.foo;
|
||||
obj10.bar1;
|
||||
obj10.bar2;
|
||||
}
|
||||
|
||||
// a construct signature that returns any
|
||||
interface FConstructor {
|
||||
new (): any;
|
||||
}
|
||||
interface F {
|
||||
foo: string;
|
||||
bar: number;
|
||||
}
|
||||
declare var F: FConstructor;
|
||||
|
||||
var obj11: F | string;
|
||||
if (obj11 instanceof F) { // can't type narrowing, construct signiture returns any.
|
||||
obj11.foo;
|
||||
~~~
|
||||
!!! error TS2339: Property 'foo' does not exist on type 'string | F'.
|
||||
obj11.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'string | F'.
|
||||
}
|
||||
|
||||
var obj12: any;
|
||||
if (obj12 instanceof F) { // can't type narrowing from any.
|
||||
obj12.foo;
|
||||
obj12.bar;
|
||||
}
|
||||
|
||||
// a type with a prototype, it overrides the construct signiture
|
||||
interface GConstructor {
|
||||
prototype: G1; // high priority
|
||||
new (): G2; // low priority
|
||||
}
|
||||
interface G1 {
|
||||
foo1: number;
|
||||
}
|
||||
interface G2 {
|
||||
foo2: boolean;
|
||||
}
|
||||
declare var G: GConstructor;
|
||||
|
||||
var obj13: G1 | G2;
|
||||
if (obj13 instanceof G) { // narrowed to G1. G1 is return type of prototype property.
|
||||
obj13.foo1;
|
||||
obj13.foo2;
|
||||
~~~~
|
||||
!!! error TS2339: Property 'foo2' does not exist on type 'G1'.
|
||||
}
|
||||
|
||||
var obj14: any;
|
||||
if (obj14 instanceof G) { // can't type narrowing from any.
|
||||
obj14.foo1;
|
||||
obj14.foo2;
|
||||
}
|
||||
|
||||
// a type with a prototype that has any type
|
||||
interface HConstructor {
|
||||
prototype: any; // high priority, but any type is ignored. interface has implicit `prototype: any`.
|
||||
new (): H; // low priority
|
||||
}
|
||||
interface H {
|
||||
foo: number;
|
||||
}
|
||||
declare var H: HConstructor;
|
||||
|
||||
var obj15: H | string;
|
||||
if (obj15 instanceof H) { // narrowed to H.
|
||||
obj15.foo;
|
||||
obj15.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'H'.
|
||||
}
|
||||
|
||||
var obj16: any;
|
||||
if (obj16 instanceof H) { // can't type narrowing from any.
|
||||
obj16.foo1;
|
||||
obj16.foo2;
|
||||
}
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(12,10): error TS2339: Property 'bar' does not exist on type 'A'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(33,5): error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(34,10): error TS2339: Property 'bar' does not exist on type 'B<number>'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(63,10): error TS2339: Property 'bar2' does not exist on type 'C1'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(82,10): error TS2339: Property 'bar' does not exist on type 'D'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(109,10): error TS2339: Property 'bar2' does not exist on type 'E1'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(131,11): error TS2339: Property 'foo' does not exist on type 'string | F'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(132,11): error TS2339: Property 'bar' does not exist on type 'string | F'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(157,11): error TS2339: Property 'foo2' does not exist on type 'G1'.
|
||||
tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts(179,11): error TS2339: Property 'bar' does not exist on type 'H'.
|
||||
|
||||
|
||||
==== tests/cases/conformance/expressions/typeGuards/typeGuardsWithInstanceOfByConstructorSignature.ts (10 errors) ====
|
||||
interface AConstructor {
|
||||
new (): A;
|
||||
}
|
||||
interface A {
|
||||
foo: string;
|
||||
}
|
||||
declare var A: AConstructor;
|
||||
|
||||
var obj1: A | string;
|
||||
if (obj1 instanceof A) { // narrowed to A.
|
||||
obj1.foo;
|
||||
obj1.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'A'.
|
||||
}
|
||||
|
||||
var obj2: any;
|
||||
if (obj2 instanceof A) { // can't narrow type from 'any'
|
||||
obj2.foo;
|
||||
obj2.bar;
|
||||
}
|
||||
|
||||
// a construct signature with generics
|
||||
interface BConstructor {
|
||||
new <T>(): B<T>;
|
||||
}
|
||||
interface B<T> {
|
||||
foo: T;
|
||||
}
|
||||
declare var B: BConstructor;
|
||||
|
||||
var obj3: B<number> | string;
|
||||
if (obj3 instanceof B) { // narrowed to B<number>.
|
||||
obj3.foo = 1;
|
||||
obj3.foo = "str";
|
||||
~~~~~~~~
|
||||
!!! error TS2322: Type 'string' is not assignable to type 'number'.
|
||||
obj3.bar = "str";
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'B<number>'.
|
||||
}
|
||||
|
||||
var obj4: any;
|
||||
if (obj4 instanceof B) { // can't narrow type from 'any'
|
||||
obj4.foo = "str";
|
||||
obj4.foo = 1;
|
||||
obj4.bar = "str";
|
||||
}
|
||||
|
||||
// has multiple construct signature
|
||||
interface CConstructor {
|
||||
new (value: string): C1;
|
||||
new (value: number): C2;
|
||||
}
|
||||
interface C1 {
|
||||
foo: string;
|
||||
bar1: number;
|
||||
}
|
||||
interface C2 {
|
||||
foo: string;
|
||||
bar2: number;
|
||||
}
|
||||
declare var C: CConstructor;
|
||||
|
||||
var obj5: C1 | A;
|
||||
if (obj5 instanceof C) { // narrowed to C1.
|
||||
obj5.foo;
|
||||
obj5.bar1;
|
||||
obj5.bar2;
|
||||
~~~~
|
||||
!!! error TS2339: Property 'bar2' does not exist on type 'C1'.
|
||||
}
|
||||
|
||||
var obj6: any;
|
||||
if (obj6 instanceof C) { // can't narrow type from 'any'
|
||||
obj6.foo;
|
||||
obj6.bar1;
|
||||
obj6.bar2;
|
||||
}
|
||||
|
||||
// with object type literal
|
||||
interface D {
|
||||
foo: string;
|
||||
}
|
||||
declare var D: { new (): D; };
|
||||
|
||||
var obj7: D | string;
|
||||
if (obj7 instanceof D) { // narrowed to D.
|
||||
obj7.foo;
|
||||
obj7.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'D'.
|
||||
}
|
||||
|
||||
var obj8: any;
|
||||
if (obj8 instanceof D) { // can't narrow type from 'any'
|
||||
obj8.foo;
|
||||
obj8.bar;
|
||||
}
|
||||
|
||||
// a construct signature that returns a union type
|
||||
interface EConstructor {
|
||||
new (): E1 | E2;
|
||||
}
|
||||
interface E1 {
|
||||
foo: string;
|
||||
bar1: number;
|
||||
}
|
||||
interface E2 {
|
||||
foo: string;
|
||||
bar2: number;
|
||||
}
|
||||
declare var E: EConstructor;
|
||||
|
||||
var obj9: E1 | A;
|
||||
if (obj9 instanceof E) { // narrowed to E1.
|
||||
obj9.foo;
|
||||
obj9.bar1;
|
||||
obj9.bar2;
|
||||
~~~~
|
||||
!!! error TS2339: Property 'bar2' does not exist on type 'E1'.
|
||||
}
|
||||
|
||||
var obj10: any;
|
||||
if (obj10 instanceof E) { // can't narrow type from 'any'
|
||||
obj10.foo;
|
||||
obj10.bar1;
|
||||
obj10.bar2;
|
||||
}
|
||||
|
||||
// a construct signature that returns any
|
||||
interface FConstructor {
|
||||
new (): any;
|
||||
}
|
||||
interface F {
|
||||
foo: string;
|
||||
bar: number;
|
||||
}
|
||||
declare var F: FConstructor;
|
||||
|
||||
var obj11: F | string;
|
||||
if (obj11 instanceof F) { // can't type narrowing, construct signature returns any.
|
||||
obj11.foo;
|
||||
~~~
|
||||
!!! error TS2339: Property 'foo' does not exist on type 'string | F'.
|
||||
obj11.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'string | F'.
|
||||
}
|
||||
|
||||
var obj12: any;
|
||||
if (obj12 instanceof F) { // can't narrow type from 'any'
|
||||
obj12.foo;
|
||||
obj12.bar;
|
||||
}
|
||||
|
||||
// a type with a prototype, it overrides the construct signature
|
||||
interface GConstructor {
|
||||
prototype: G1; // high priority
|
||||
new (): G2; // low priority
|
||||
}
|
||||
interface G1 {
|
||||
foo1: number;
|
||||
}
|
||||
interface G2 {
|
||||
foo2: boolean;
|
||||
}
|
||||
declare var G: GConstructor;
|
||||
|
||||
var obj13: G1 | G2;
|
||||
if (obj13 instanceof G) { // narrowed to G1. G1 is return type of prototype property.
|
||||
obj13.foo1;
|
||||
obj13.foo2;
|
||||
~~~~
|
||||
!!! error TS2339: Property 'foo2' does not exist on type 'G1'.
|
||||
}
|
||||
|
||||
var obj14: any;
|
||||
if (obj14 instanceof G) { // can't narrow type from 'any'
|
||||
obj14.foo1;
|
||||
obj14.foo2;
|
||||
}
|
||||
|
||||
// a type with a prototype that has any type
|
||||
interface HConstructor {
|
||||
prototype: any; // high priority, but any type is ignored. interface has implicit `prototype: any`.
|
||||
new (): H; // low priority
|
||||
}
|
||||
interface H {
|
||||
foo: number;
|
||||
}
|
||||
declare var H: HConstructor;
|
||||
|
||||
var obj15: H | string;
|
||||
if (obj15 instanceof H) { // narrowed to H.
|
||||
obj15.foo;
|
||||
obj15.bar;
|
||||
~~~
|
||||
!!! error TS2339: Property 'bar' does not exist on type 'H'.
|
||||
}
|
||||
|
||||
var obj16: any;
|
||||
if (obj16 instanceof H) { // can't narrow type from 'any'
|
||||
obj16.foo1;
|
||||
obj16.foo2;
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
//// [typeGuardsWithInstanceOfByConstructorSignature.ts]
|
||||
//// [typeGuardsWithInstanceOfByConstructorSignature.ts]
|
||||
interface AConstructor {
|
||||
new (): A;
|
||||
}
|
||||
@@ -14,7 +14,7 @@ if (obj1 instanceof A) { // narrowed to A.
|
||||
}
|
||||
|
||||
var obj2: any;
|
||||
if (obj2 instanceof A) { // can't type narrowing from any.
|
||||
if (obj2 instanceof A) { // can't narrow type from 'any'
|
||||
obj2.foo;
|
||||
obj2.bar;
|
||||
}
|
||||
@@ -36,7 +36,7 @@ if (obj3 instanceof B) { // narrowed to B<number>.
|
||||
}
|
||||
|
||||
var obj4: any;
|
||||
if (obj4 instanceof B) { // can't type narrowing from any.
|
||||
if (obj4 instanceof B) { // can't narrow type from 'any'
|
||||
obj4.foo = "str";
|
||||
obj4.foo = 1;
|
||||
obj4.bar = "str";
|
||||
@@ -65,7 +65,7 @@ if (obj5 instanceof C) { // narrowed to C1.
|
||||
}
|
||||
|
||||
var obj6: any;
|
||||
if (obj6 instanceof C) { // can't type narrowing from any.
|
||||
if (obj6 instanceof C) { // can't narrow type from 'any'
|
||||
obj6.foo;
|
||||
obj6.bar1;
|
||||
obj6.bar2;
|
||||
@@ -84,7 +84,7 @@ if (obj7 instanceof D) { // narrowed to D.
|
||||
}
|
||||
|
||||
var obj8: any;
|
||||
if (obj8 instanceof D) { // can't type narrowing from any.
|
||||
if (obj8 instanceof D) { // can't narrow type from 'any'
|
||||
obj8.foo;
|
||||
obj8.bar;
|
||||
}
|
||||
@@ -111,7 +111,7 @@ if (obj9 instanceof E) { // narrowed to E1.
|
||||
}
|
||||
|
||||
var obj10: any;
|
||||
if (obj10 instanceof E) { // can't type narrowing from any.
|
||||
if (obj10 instanceof E) { // can't narrow type from 'any'
|
||||
obj10.foo;
|
||||
obj10.bar1;
|
||||
obj10.bar2;
|
||||
@@ -128,18 +128,18 @@ interface F {
|
||||
declare var F: FConstructor;
|
||||
|
||||
var obj11: F | string;
|
||||
if (obj11 instanceof F) { // can't type narrowing, construct signiture returns any.
|
||||
if (obj11 instanceof F) { // can't type narrowing, construct signature returns any.
|
||||
obj11.foo;
|
||||
obj11.bar;
|
||||
}
|
||||
|
||||
var obj12: any;
|
||||
if (obj12 instanceof F) { // can't type narrowing from any.
|
||||
if (obj12 instanceof F) { // can't narrow type from 'any'
|
||||
obj12.foo;
|
||||
obj12.bar;
|
||||
}
|
||||
|
||||
// a type with a prototype, it overrides the construct signiture
|
||||
// a type with a prototype, it overrides the construct signature
|
||||
interface GConstructor {
|
||||
prototype: G1; // high priority
|
||||
new (): G2; // low priority
|
||||
@@ -159,7 +159,7 @@ if (obj13 instanceof G) { // narrowed to G1. G1 is return type of prototype prop
|
||||
}
|
||||
|
||||
var obj14: any;
|
||||
if (obj14 instanceof G) { // can't type narrowing from any.
|
||||
if (obj14 instanceof G) { // can't narrow type from 'any'
|
||||
obj14.foo1;
|
||||
obj14.foo2;
|
||||
}
|
||||
@@ -181,96 +181,96 @@ if (obj15 instanceof H) { // narrowed to H.
|
||||
}
|
||||
|
||||
var obj16: any;
|
||||
if (obj16 instanceof H) { // can't type narrowing from any.
|
||||
obj16.foo1;
|
||||
obj16.foo2;
|
||||
}
|
||||
|
||||
|
||||
//// [typeGuardsWithInstanceOfByConstructorSignature.js]
|
||||
var obj1;
|
||||
if (obj1 instanceof A) {
|
||||
obj1.foo;
|
||||
obj1.bar;
|
||||
}
|
||||
var obj2;
|
||||
if (obj2 instanceof A) {
|
||||
obj2.foo;
|
||||
obj2.bar;
|
||||
}
|
||||
var obj3;
|
||||
if (obj3 instanceof B) {
|
||||
obj3.foo = 1;
|
||||
obj3.foo = "str";
|
||||
obj3.bar = "str";
|
||||
}
|
||||
var obj4;
|
||||
if (obj4 instanceof B) {
|
||||
obj4.foo = "str";
|
||||
obj4.foo = 1;
|
||||
obj4.bar = "str";
|
||||
}
|
||||
var obj5;
|
||||
if (obj5 instanceof C) {
|
||||
obj5.foo;
|
||||
obj5.bar1;
|
||||
obj5.bar2;
|
||||
}
|
||||
var obj6;
|
||||
if (obj6 instanceof C) {
|
||||
obj6.foo;
|
||||
obj6.bar1;
|
||||
obj6.bar2;
|
||||
}
|
||||
var obj7;
|
||||
if (obj7 instanceof D) {
|
||||
obj7.foo;
|
||||
obj7.bar;
|
||||
}
|
||||
var obj8;
|
||||
if (obj8 instanceof D) {
|
||||
obj8.foo;
|
||||
obj8.bar;
|
||||
}
|
||||
var obj9;
|
||||
if (obj9 instanceof E) {
|
||||
obj9.foo;
|
||||
obj9.bar1;
|
||||
obj9.bar2;
|
||||
}
|
||||
var obj10;
|
||||
if (obj10 instanceof E) {
|
||||
obj10.foo;
|
||||
obj10.bar1;
|
||||
obj10.bar2;
|
||||
}
|
||||
var obj11;
|
||||
if (obj11 instanceof F) {
|
||||
obj11.foo;
|
||||
obj11.bar;
|
||||
}
|
||||
var obj12;
|
||||
if (obj12 instanceof F) {
|
||||
obj12.foo;
|
||||
obj12.bar;
|
||||
}
|
||||
var obj13;
|
||||
if (obj13 instanceof G) {
|
||||
obj13.foo1;
|
||||
obj13.foo2;
|
||||
}
|
||||
var obj14;
|
||||
if (obj14 instanceof G) {
|
||||
obj14.foo1;
|
||||
obj14.foo2;
|
||||
}
|
||||
var obj15;
|
||||
if (obj15 instanceof H) {
|
||||
obj15.foo;
|
||||
obj15.bar;
|
||||
}
|
||||
var obj16;
|
||||
if (obj16 instanceof H) {
|
||||
if (obj16 instanceof H) { // can't narrow type from 'any'
|
||||
obj16.foo1;
|
||||
obj16.foo2;
|
||||
}
|
||||
|
||||
|
||||
//// [typeGuardsWithInstanceOfByConstructorSignature.js]
|
||||
var obj1;
|
||||
if (obj1 instanceof A) {
|
||||
obj1.foo;
|
||||
obj1.bar;
|
||||
}
|
||||
var obj2;
|
||||
if (obj2 instanceof A) {
|
||||
obj2.foo;
|
||||
obj2.bar;
|
||||
}
|
||||
var obj3;
|
||||
if (obj3 instanceof B) {
|
||||
obj3.foo = 1;
|
||||
obj3.foo = "str";
|
||||
obj3.bar = "str";
|
||||
}
|
||||
var obj4;
|
||||
if (obj4 instanceof B) {
|
||||
obj4.foo = "str";
|
||||
obj4.foo = 1;
|
||||
obj4.bar = "str";
|
||||
}
|
||||
var obj5;
|
||||
if (obj5 instanceof C) {
|
||||
obj5.foo;
|
||||
obj5.bar1;
|
||||
obj5.bar2;
|
||||
}
|
||||
var obj6;
|
||||
if (obj6 instanceof C) {
|
||||
obj6.foo;
|
||||
obj6.bar1;
|
||||
obj6.bar2;
|
||||
}
|
||||
var obj7;
|
||||
if (obj7 instanceof D) {
|
||||
obj7.foo;
|
||||
obj7.bar;
|
||||
}
|
||||
var obj8;
|
||||
if (obj8 instanceof D) {
|
||||
obj8.foo;
|
||||
obj8.bar;
|
||||
}
|
||||
var obj9;
|
||||
if (obj9 instanceof E) {
|
||||
obj9.foo;
|
||||
obj9.bar1;
|
||||
obj9.bar2;
|
||||
}
|
||||
var obj10;
|
||||
if (obj10 instanceof E) {
|
||||
obj10.foo;
|
||||
obj10.bar1;
|
||||
obj10.bar2;
|
||||
}
|
||||
var obj11;
|
||||
if (obj11 instanceof F) {
|
||||
obj11.foo;
|
||||
obj11.bar;
|
||||
}
|
||||
var obj12;
|
||||
if (obj12 instanceof F) {
|
||||
obj12.foo;
|
||||
obj12.bar;
|
||||
}
|
||||
var obj13;
|
||||
if (obj13 instanceof G) {
|
||||
obj13.foo1;
|
||||
obj13.foo2;
|
||||
}
|
||||
var obj14;
|
||||
if (obj14 instanceof G) {
|
||||
obj14.foo1;
|
||||
obj14.foo2;
|
||||
}
|
||||
var obj15;
|
||||
if (obj15 instanceof H) {
|
||||
obj15.foo;
|
||||
obj15.bar;
|
||||
}
|
||||
var obj16;
|
||||
if (obj16 instanceof H) {
|
||||
obj16.foo1;
|
||||
obj16.foo2;
|
||||
}
|
||||
|
||||
@@ -13,7 +13,7 @@ if (obj1 instanceof A) { // narrowed to A.
|
||||
}
|
||||
|
||||
var obj2: any;
|
||||
if (obj2 instanceof A) { // can't type narrowing from any.
|
||||
if (obj2 instanceof A) { // can't narrow type from 'any'
|
||||
obj2.foo;
|
||||
obj2.bar;
|
||||
}
|
||||
@@ -35,7 +35,7 @@ if (obj3 instanceof B) { // narrowed to B<number>.
|
||||
}
|
||||
|
||||
var obj4: any;
|
||||
if (obj4 instanceof B) { // can't type narrowing from any.
|
||||
if (obj4 instanceof B) { // can't narrow type from 'any'
|
||||
obj4.foo = "str";
|
||||
obj4.foo = 1;
|
||||
obj4.bar = "str";
|
||||
@@ -64,7 +64,7 @@ if (obj5 instanceof C) { // narrowed to C1.
|
||||
}
|
||||
|
||||
var obj6: any;
|
||||
if (obj6 instanceof C) { // can't type narrowing from any.
|
||||
if (obj6 instanceof C) { // can't narrow type from 'any'
|
||||
obj6.foo;
|
||||
obj6.bar1;
|
||||
obj6.bar2;
|
||||
@@ -83,7 +83,7 @@ if (obj7 instanceof D) { // narrowed to D.
|
||||
}
|
||||
|
||||
var obj8: any;
|
||||
if (obj8 instanceof D) { // can't type narrowing from any.
|
||||
if (obj8 instanceof D) { // can't narrow type from 'any'
|
||||
obj8.foo;
|
||||
obj8.bar;
|
||||
}
|
||||
@@ -110,7 +110,7 @@ if (obj9 instanceof E) { // narrowed to E1.
|
||||
}
|
||||
|
||||
var obj10: any;
|
||||
if (obj10 instanceof E) { // can't type narrowing from any.
|
||||
if (obj10 instanceof E) { // can't narrow type from 'any'
|
||||
obj10.foo;
|
||||
obj10.bar1;
|
||||
obj10.bar2;
|
||||
@@ -127,18 +127,18 @@ interface F {
|
||||
declare var F: FConstructor;
|
||||
|
||||
var obj11: F | string;
|
||||
if (obj11 instanceof F) { // can't type narrowing, construct signiture returns any.
|
||||
if (obj11 instanceof F) { // can't type narrowing, construct signature returns any.
|
||||
obj11.foo;
|
||||
obj11.bar;
|
||||
}
|
||||
|
||||
var obj12: any;
|
||||
if (obj12 instanceof F) { // can't type narrowing from any.
|
||||
if (obj12 instanceof F) { // can't narrow type from 'any'
|
||||
obj12.foo;
|
||||
obj12.bar;
|
||||
}
|
||||
|
||||
// a type with a prototype, it overrides the construct signiture
|
||||
// a type with a prototype, it overrides the construct signature
|
||||
interface GConstructor {
|
||||
prototype: G1; // high priority
|
||||
new (): G2; // low priority
|
||||
@@ -158,7 +158,7 @@ if (obj13 instanceof G) { // narrowed to G1. G1 is return type of prototype prop
|
||||
}
|
||||
|
||||
var obj14: any;
|
||||
if (obj14 instanceof G) { // can't type narrowing from any.
|
||||
if (obj14 instanceof G) { // can't narrow type from 'any'
|
||||
obj14.foo1;
|
||||
obj14.foo2;
|
||||
}
|
||||
@@ -180,7 +180,7 @@ if (obj15 instanceof H) { // narrowed to H.
|
||||
}
|
||||
|
||||
var obj16: any;
|
||||
if (obj16 instanceof H) { // can't type narrowing from any.
|
||||
if (obj16 instanceof H) { // can't narrow type from 'any'
|
||||
obj16.foo1;
|
||||
obj16.foo2;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user