Test index [access] types inside spread types

This commit is contained in:
Nathan Shively-Sanders 2016-11-02 11:37:52 -07:00
parent f2d739ffcf
commit f65dd2101c
3 changed files with 119 additions and 1 deletions

View file

@ -14,9 +14,17 @@ tests/cases/conformance/types/spread/objectSpreadGeneric.ts(38,11): error TS2322
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(42,11): error TS2322: Type '{ firrrrrrst: string; ...T; second: string; ...U; third: string; }' is not assignable to type '{ first: string; ...T; second: string; ...U; third: string; }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(44,11): error TS2322: Type '{ first: string; ...T; ssssssssecond: string; ...U; third: string; }' is not assignable to type '{ first: string; ...T; second: string; ...U; third: string; }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(46,11): error TS2322: Type '{ first: string; ...T; second: string; ...U; thirrrrrrrd: string; }' is not assignable to type '{ first: string; ...T; second: string; ...U; third: string; }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(57,5): error TS2322: Type '{ ...keyof U }' is not assignable to type '{ ...keyof T }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(58,5): error TS2322: Type '{ ...keyof T }' is not assignable to type '{ ...keyof U }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(61,5): error TS2322: Type '{ ...K }' is not assignable to type '{ ...keyof T }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(62,5): error TS2322: Type '{ ...keyof T }' is not assignable to type '{ ...K }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(63,5): error TS2322: Type '{ ...J }' is not assignable to type '{ ...keyof U }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(64,5): error TS2322: Type '{ ...keyof U }' is not assignable to type '{ ...J }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(70,5): error TS2322: Type '{ ...U[J] }' is not assignable to type '{ ...T[K] }'.
tests/cases/conformance/types/spread/objectSpreadGeneric.ts(71,5): error TS2322: Type '{ ...T[K] }' is not assignable to type '{ ...U[J] }'.
==== tests/cases/conformance/types/spread/objectSpreadGeneric.ts (16 errors) ====
==== tests/cases/conformance/types/spread/objectSpreadGeneric.ts (24 errors) ====
function f<T, U, V>(t: T, u: U, v: V): void {
let o: { ...T, ...U, ...V };
let uus: { ...U, ...U};
@ -97,4 +105,44 @@ tests/cases/conformance/types/spread/objectSpreadGeneric.ts(46,11): error TS2322
!!! error TS2322: Type '{ first: string; ...T; second: string; ...U; thirrrrrrrd: string; }' is not assignable to type '{ first: string; ...T; second: string; ...U; third: string; }'.
{ first: '1', ...t, second: '2', ...u, thirrrrrrrd: '3' }; // error, not assignable
}
function indexAccessedTest<T, K extends keyof T, U, J extends keyof U>(t: T, u: U, key1: K, key2: J) {
let k1: { ...keyof T };
let k2: { ...keyof U };
let k3: { ...K };
let k4: { ...J };
k1 = k1; // ok
k2 = k2; // ok
k1 = k2; // error
~~
!!! error TS2322: Type '{ ...keyof U }' is not assignable to type '{ ...keyof T }'.
k2 = k1; // error
~~
!!! error TS2322: Type '{ ...keyof T }' is not assignable to type '{ ...keyof U }'.
k3 = k3; // ok
k4 = k4; // ok
k1 = k3; // error
~~
!!! error TS2322: Type '{ ...K }' is not assignable to type '{ ...keyof T }'.
k3 = k1; // error
~~
!!! error TS2322: Type '{ ...keyof T }' is not assignable to type '{ ...K }'.
k2 = k4; // error
~~
!!! error TS2322: Type '{ ...J }' is not assignable to type '{ ...keyof U }'.
k4 = k2; // error
~~
!!! error TS2322: Type '{ ...keyof U }' is not assignable to type '{ ...J }'.
let i1: { ...T[K] };
let i2: { ...U[J] };
i1 = i1; // ok
i2 = i2; // ok
i1 = i2; // error
~~
!!! error TS2322: Type '{ ...U[J] }' is not assignable to type '{ ...T[K] }'.
i2 = i1; // error
~~
!!! error TS2322: Type '{ ...T[K] }' is not assignable to type '{ ...U[J] }'.
}

View file

@ -47,6 +47,30 @@ function f<T, U, V>(t: T, u: U, v: V): void {
const mismatchLast: { first: string, ...T, second: string, ...U, third: string } =
{ first: '1', ...t, second: '2', ...u, thirrrrrrrd: '3' }; // error, not assignable
}
function indexAccessedTest<T, K extends keyof T, U, J extends keyof U>(t: T, u: U, key1: K, key2: J) {
let k1: { ...keyof T };
let k2: { ...keyof U };
let k3: { ...K };
let k4: { ...J };
k1 = k1; // ok
k2 = k2; // ok
k1 = k2; // error
k2 = k1; // error
k3 = k3; // ok
k4 = k4; // ok
k1 = k3; // error
k3 = k1; // error
k2 = k4; // error
k4 = k2; // error
let i1: { ...T[K] };
let i2: { ...U[J] };
i1 = i1; // ok
i2 = i2; // ok
i1 = i2; // error
i2 = i1; // error
}
//// [objectSpreadGeneric.js]
@ -93,3 +117,25 @@ function f(t, u, v) {
var mismatchSecond = __assign({ first: '1' }, t, { ssssssssecond: '2' }, u, { third: '3' }); // error, not assignable
var mismatchLast = __assign({ first: '1' }, t, { second: '2' }, u, { thirrrrrrrd: '3' }); // error, not assignable
}
function indexAccessedTest(t, u, key1, key2) {
var k1;
var k2;
var k3;
var k4;
k1 = k1; // ok
k2 = k2; // ok
k1 = k2; // error
k2 = k1; // error
k3 = k3; // ok
k4 = k4; // ok
k1 = k3; // error
k3 = k1; // error
k2 = k4; // error
k4 = k2; // error
var i1;
var i2;
i1 = i1; // ok
i2 = i2; // ok
i1 = i2; // error
i2 = i1; // error
}

View file

@ -46,3 +46,27 @@ function f<T, U, V>(t: T, u: U, v: V): void {
const mismatchLast: { first: string, ...T, second: string, ...U, third: string } =
{ first: '1', ...t, second: '2', ...u, thirrrrrrrd: '3' }; // error, not assignable
}
function indexAccessedTest<T, K extends keyof T, U, J extends keyof U>(t: T, u: U, key1: K, key2: J) {
let k1: { ...keyof T };
let k2: { ...keyof U };
let k3: { ...K };
let k4: { ...J };
k1 = k1; // ok
k2 = k2; // ok
k1 = k2; // error
k2 = k1; // error
k3 = k3; // ok
k4 = k4; // ok
k1 = k3; // error
k3 = k1; // error
k2 = k4; // error
k4 = k2; // error
let i1: { ...T[K] };
let i2: { ...U[J] };
i1 = i1; // ok
i2 = i2; // ok
i1 = i2; // error
i2 = i1; // error
}