Add new tests

This commit is contained in:
Anders Hejlsberg 2016-11-18 06:27:45 -08:00
parent 79bdc26745
commit 075a3eb98f
3 changed files with 437 additions and 0 deletions

View file

@ -0,0 +1,165 @@
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(12,5): error TS2322: Type 'T[keyof T]' is not assignable to type 'U[keyof T]'.
Type 'T' is not assignable to type 'U'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(17,5): error TS2322: Type 'T[K]' is not assignable to type 'U[K]'.
Type 'T' is not assignable to type 'U'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(21,5): error TS2536: Type 'keyof U' cannot be used to index type 'T'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(22,12): error TS2536: Type 'keyof U' cannot be used to index type 'T'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(26,5): error TS2536: Type 'K' cannot be used to index type 'T'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(27,12): error TS2536: Type 'K' cannot be used to index type 'T'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(31,5): error TS2322: Type 'T[keyof T] | undefined' is not assignable to type 'T[keyof T]'.
Type 'undefined' is not assignable to type 'T[keyof T]'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(36,5): error TS2322: Type 'T[K] | undefined' is not assignable to type 'T[K]'.
Type 'undefined' is not assignable to type 'T[K]'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(41,5): error TS2322: Type 'U[keyof T] | undefined' is not assignable to type 'T[keyof T]'.
Type 'undefined' is not assignable to type 'T[keyof T]'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(42,5): error TS2322: Type 'T[keyof T]' is not assignable to type 'U[keyof T] | undefined'.
Type 'T[keyof T]' is not assignable to type 'U[keyof T]'.
Type 'T' is not assignable to type 'U'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(46,5): error TS2322: Type 'U[K] | undefined' is not assignable to type 'T[K]'.
Type 'undefined' is not assignable to type 'T[K]'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(47,5): error TS2322: Type 'T[K]' is not assignable to type 'U[K] | undefined'.
Type 'T[K]' is not assignable to type 'U[K]'.
Type 'T' is not assignable to type 'U'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(52,5): error TS2542: Index signature in type 'Readonly<T>' only permits reading.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(57,5): error TS2542: Index signature in type 'Readonly<T>' only permits reading.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(62,5): error TS2542: Index signature in type 'Readonly<U>' only permits reading.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(67,5): error TS2542: Index signature in type 'Readonly<U>' only permits reading.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(71,5): error TS2322: Type 'Partial<T>' is not assignable to type 'T'.
tests/cases/conformance/types/mapped/mappedTypeRelationships.ts(76,5): error TS2322: Type 'Partial<T>' is not assignable to type 'T'.
==== tests/cases/conformance/types/mapped/mappedTypeRelationships.ts (18 errors) ====
function f1<T>(x: T, k: keyof T) {
return x[k];
}
function f2<T, K extends keyof T>(x: T, k: K) {
return x[k];
}
function f3<T, U extends T>(x: T, y: U, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
~~~~
!!! error TS2322: Type 'T[keyof T]' is not assignable to type 'U[keyof T]'.
!!! error TS2322: Type 'T' is not assignable to type 'U'.
}
function f4<T, U extends T, K extends keyof T>(x: T, y: U, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
~~~~
!!! error TS2322: Type 'T[K]' is not assignable to type 'U[K]'.
!!! error TS2322: Type 'T' is not assignable to type 'U'.
}
function f5<T, U extends T>(x: T, y: U, k: keyof U) {
x[k] = y[k]; // Error
~~~~
!!! error TS2536: Type 'keyof U' cannot be used to index type 'T'.
y[k] = x[k]; // Error
~~~~
!!! error TS2536: Type 'keyof U' cannot be used to index type 'T'.
}
function f6<T, U extends T, K extends keyof U>(x: T, y: U, k: K) {
x[k] = y[k]; // Error
~~~~
!!! error TS2536: Type 'K' cannot be used to index type 'T'.
y[k] = x[k]; // Error
~~~~
!!! error TS2536: Type 'K' cannot be used to index type 'T'.
}
function f10<T>(x: T, y: Partial<T>, k: keyof T) {
x[k] = y[k]; // Error
~~~~
!!! error TS2322: Type 'T[keyof T] | undefined' is not assignable to type 'T[keyof T]'.
!!! error TS2322: Type 'undefined' is not assignable to type 'T[keyof T]'.
y[k] = x[k];
}
function f11<T, K extends keyof T>(x: T, y: Partial<T>, k: K) {
x[k] = y[k]; // Error
~~~~
!!! error TS2322: Type 'T[K] | undefined' is not assignable to type 'T[K]'.
!!! error TS2322: Type 'undefined' is not assignable to type 'T[K]'.
y[k] = x[k];
}
function f12<T, U extends T>(x: T, y: Partial<U>, k: keyof T) {
x[k] = y[k]; // Error
~~~~
!!! error TS2322: Type 'U[keyof T] | undefined' is not assignable to type 'T[keyof T]'.
!!! error TS2322: Type 'undefined' is not assignable to type 'T[keyof T]'.
y[k] = x[k]; // Error
~~~~
!!! error TS2322: Type 'T[keyof T]' is not assignable to type 'U[keyof T] | undefined'.
!!! error TS2322: Type 'T[keyof T]' is not assignable to type 'U[keyof T]'.
!!! error TS2322: Type 'T' is not assignable to type 'U'.
}
function f13<T, U extends T, K extends keyof T>(x: T, y: Partial<U>, k: K) {
x[k] = y[k]; // Error
~~~~
!!! error TS2322: Type 'U[K] | undefined' is not assignable to type 'T[K]'.
!!! error TS2322: Type 'undefined' is not assignable to type 'T[K]'.
y[k] = x[k]; // Error
~~~~
!!! error TS2322: Type 'T[K]' is not assignable to type 'U[K] | undefined'.
!!! error TS2322: Type 'T[K]' is not assignable to type 'U[K]'.
!!! error TS2322: Type 'T' is not assignable to type 'U'.
}
function f20<T>(x: T, y: Readonly<T>, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
~~~~
!!! error TS2542: Index signature in type 'Readonly<T>' only permits reading.
}
function f21<T, K extends keyof T>(x: T, y: Readonly<T>, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
~~~~
!!! error TS2542: Index signature in type 'Readonly<T>' only permits reading.
}
function f22<T, U extends T>(x: T, y: Readonly<U>, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
~~~~
!!! error TS2542: Index signature in type 'Readonly<U>' only permits reading.
}
function f23<T, U extends T, K extends keyof T>(x: T, y: Readonly<U>, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
~~~~
!!! error TS2542: Index signature in type 'Readonly<U>' only permits reading.
}
function f30<T>(x: T, y: Partial<T>) {
x = y; // Error
~
!!! error TS2322: Type 'Partial<T>' is not assignable to type 'T'.
y = x;
}
function f31<T>(x: T, y: Partial<T>) {
x = y; // Error
~
!!! error TS2322: Type 'Partial<T>' is not assignable to type 'T'.
y = x;
}
function f40<T>(x: T, y: Readonly<T>) {
x = y;
y = x;
}
function f41<T>(x: T, y: Readonly<T>) {
x = y;
y = x;
}

View file

@ -0,0 +1,182 @@
//// [mappedTypeRelationships.ts]
function f1<T>(x: T, k: keyof T) {
return x[k];
}
function f2<T, K extends keyof T>(x: T, k: K) {
return x[k];
}
function f3<T, U extends T>(x: T, y: U, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f4<T, U extends T, K extends keyof T>(x: T, y: U, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f5<T, U extends T>(x: T, y: U, k: keyof U) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f6<T, U extends T, K extends keyof U>(x: T, y: U, k: K) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f10<T>(x: T, y: Partial<T>, k: keyof T) {
x[k] = y[k]; // Error
y[k] = x[k];
}
function f11<T, K extends keyof T>(x: T, y: Partial<T>, k: K) {
x[k] = y[k]; // Error
y[k] = x[k];
}
function f12<T, U extends T>(x: T, y: Partial<U>, k: keyof T) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f13<T, U extends T, K extends keyof T>(x: T, y: Partial<U>, k: K) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f20<T>(x: T, y: Readonly<T>, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f21<T, K extends keyof T>(x: T, y: Readonly<T>, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f22<T, U extends T>(x: T, y: Readonly<U>, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f23<T, U extends T, K extends keyof T>(x: T, y: Readonly<U>, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f30<T>(x: T, y: Partial<T>) {
x = y; // Error
y = x;
}
function f31<T>(x: T, y: Partial<T>) {
x = y; // Error
y = x;
}
function f40<T>(x: T, y: Readonly<T>) {
x = y;
y = x;
}
function f41<T>(x: T, y: Readonly<T>) {
x = y;
y = x;
}
//// [mappedTypeRelationships.js]
function f1(x, k) {
return x[k];
}
function f2(x, k) {
return x[k];
}
function f3(x, y, k) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f4(x, y, k) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f5(x, y, k) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f6(x, y, k) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f10(x, y, k) {
x[k] = y[k]; // Error
y[k] = x[k];
}
function f11(x, y, k) {
x[k] = y[k]; // Error
y[k] = x[k];
}
function f12(x, y, k) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f13(x, y, k) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f20(x, y, k) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f21(x, y, k) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f22(x, y, k) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f23(x, y, k) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f30(x, y) {
x = y; // Error
y = x;
}
function f31(x, y) {
x = y; // Error
y = x;
}
function f40(x, y) {
x = y;
y = x;
}
function f41(x, y) {
x = y;
y = x;
}
//// [mappedTypeRelationships.d.ts]
declare function f1<T>(x: T, k: keyof T): T[keyof T];
declare function f2<T, K extends keyof T>(x: T, k: K): T[K];
declare function f3<T, U extends T>(x: T, y: U, k: keyof T): void;
declare function f4<T, U extends T, K extends keyof T>(x: T, y: U, k: K): void;
declare function f5<T, U extends T>(x: T, y: U, k: keyof U): void;
declare function f6<T, U extends T, K extends keyof U>(x: T, y: U, k: K): void;
declare function f10<T>(x: T, y: Partial<T>, k: keyof T): void;
declare function f11<T, K extends keyof T>(x: T, y: Partial<T>, k: K): void;
declare function f12<T, U extends T>(x: T, y: Partial<U>, k: keyof T): void;
declare function f13<T, U extends T, K extends keyof T>(x: T, y: Partial<U>, k: K): void;
declare function f20<T>(x: T, y: Readonly<T>, k: keyof T): void;
declare function f21<T, K extends keyof T>(x: T, y: Readonly<T>, k: K): void;
declare function f22<T, U extends T>(x: T, y: Readonly<U>, k: keyof T): void;
declare function f23<T, U extends T, K extends keyof T>(x: T, y: Readonly<U>, k: K): void;
declare function f30<T>(x: T, y: Partial<T>): void;
declare function f31<T>(x: T, y: Partial<T>): void;
declare function f40<T>(x: T, y: Readonly<T>): void;
declare function f41<T>(x: T, y: Readonly<T>): void;

View file

@ -0,0 +1,90 @@
// @strictNullChecks: true
// @declaration: true
function f1<T>(x: T, k: keyof T) {
return x[k];
}
function f2<T, K extends keyof T>(x: T, k: K) {
return x[k];
}
function f3<T, U extends T>(x: T, y: U, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f4<T, U extends T, K extends keyof T>(x: T, y: U, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f5<T, U extends T>(x: T, y: U, k: keyof U) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f6<T, U extends T, K extends keyof U>(x: T, y: U, k: K) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f10<T>(x: T, y: Partial<T>, k: keyof T) {
x[k] = y[k]; // Error
y[k] = x[k];
}
function f11<T, K extends keyof T>(x: T, y: Partial<T>, k: K) {
x[k] = y[k]; // Error
y[k] = x[k];
}
function f12<T, U extends T>(x: T, y: Partial<U>, k: keyof T) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f13<T, U extends T, K extends keyof T>(x: T, y: Partial<U>, k: K) {
x[k] = y[k]; // Error
y[k] = x[k]; // Error
}
function f20<T>(x: T, y: Readonly<T>, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f21<T, K extends keyof T>(x: T, y: Readonly<T>, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f22<T, U extends T>(x: T, y: Readonly<U>, k: keyof T) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f23<T, U extends T, K extends keyof T>(x: T, y: Readonly<U>, k: K) {
x[k] = y[k];
y[k] = x[k]; // Error
}
function f30<T>(x: T, y: Partial<T>) {
x = y; // Error
y = x;
}
function f31<T>(x: T, y: Partial<T>) {
x = y; // Error
y = x;
}
function f40<T>(x: T, y: Readonly<T>) {
x = y;
y = x;
}
function f41<T>(x: T, y: Readonly<T>) {
x = y;
y = x;
}