Add regression tests

This commit is contained in:
Anders Hejlsberg 2017-04-03 12:32:54 -07:00
parent 2632ac280c
commit 0f0a8a17dc
3 changed files with 153 additions and 0 deletions

View File

@ -0,0 +1,48 @@
tests/cases/compiler/recursiveTypeRelations.ts(8,5): error TS2391: Function implementation is missing or not immediately following the declaration.
tests/cases/compiler/recursiveTypeRelations.ts(27,38): error TS2304: Cannot find name 'ClassNameObject'.
tests/cases/compiler/recursiveTypeRelations.ts(27,61): error TS2304: Cannot find name 'ClassNameObject'.
==== tests/cases/compiler/recursiveTypeRelations.ts (3 errors) ====
// Repro from #14896
type Attributes<Keys extends string> = {
[Key in Keys]: string;
}
class Query<A extends Attributes<keyof A>> {
multiply<B extends Attributes<keyof B>>(x: B): Query<A & B>;
~~~~~~~~
!!! error TS2391: Function implementation is missing or not immediately following the declaration.
}
// Repro from #14940
type ClassName<S> = keyof S;
type ClassNameMap<S> = { [K in keyof S]?: boolean }
type ClassNameObjectMap<S> = object & ClassNameMap<S>;
type ClassNameArg<S> = ClassName<S> | ClassNameObjectMap<S>;
export function css<S extends { [K in keyof S]: string }>(styles: S, ...classNames: ClassNameArg<S>[]): string {
const args = classNames.map(arg => {
if (arg == null) {
return null;
}
if (typeof arg == "string") {
return styles[arg];
}
if (typeof arg == "object") {
return Object.keys(arg).reduce<ClassNameObject>((obj: ClassNameObject, key: keyof S) => {
~~~~~~~~~~~~~~~
!!! error TS2304: Cannot find name 'ClassNameObject'.
~~~~~~~~~~~~~~~
!!! error TS2304: Cannot find name 'ClassNameObject'.
const exportedClassName = styles[key];
obj[exportedClassName] = (arg as ClassNameMap<S>)[key];
return obj;
}, {});
}
});
return "";
}

View File

@ -0,0 +1,70 @@
//// [recursiveTypeRelations.ts]
// Repro from #14896
type Attributes<Keys extends string> = {
[Key in Keys]: string;
}
class Query<A extends Attributes<keyof A>> {
multiply<B extends Attributes<keyof B>>(x: B): Query<A & B>;
}
// Repro from #14940
type ClassName<S> = keyof S;
type ClassNameMap<S> = { [K in keyof S]?: boolean }
type ClassNameObjectMap<S> = object & ClassNameMap<S>;
type ClassNameArg<S> = ClassName<S> | ClassNameObjectMap<S>;
export function css<S extends { [K in keyof S]: string }>(styles: S, ...classNames: ClassNameArg<S>[]): string {
const args = classNames.map(arg => {
if (arg == null) {
return null;
}
if (typeof arg == "string") {
return styles[arg];
}
if (typeof arg == "object") {
return Object.keys(arg).reduce<ClassNameObject>((obj: ClassNameObject, key: keyof S) => {
const exportedClassName = styles[key];
obj[exportedClassName] = (arg as ClassNameMap<S>)[key];
return obj;
}, {});
}
});
return "";
}
//// [recursiveTypeRelations.js]
// Repro from #14896
"use strict";
exports.__esModule = true;
var Query = (function () {
function Query() {
}
return Query;
}());
function css(styles) {
var classNames = [];
for (var _i = 1; _i < arguments.length; _i++) {
classNames[_i - 1] = arguments[_i];
}
var args = classNames.map(function (arg) {
if (arg == null) {
return null;
}
if (typeof arg == "string") {
return styles[arg];
}
if (typeof arg == "object") {
return Object.keys(arg).reduce(function (obj, key) {
var exportedClassName = styles[key];
obj[exportedClassName] = arg[key];
return obj;
}, {});
}
});
return "";
}
exports.css = css;

View File

@ -0,0 +1,35 @@
// Repro from #14896
type Attributes<Keys extends string> = {
[Key in Keys]: string;
}
class Query<A extends Attributes<keyof A>> {
multiply<B extends Attributes<keyof B>>(x: B): Query<A & B>;
}
// Repro from #14940
type ClassName<S> = keyof S;
type ClassNameMap<S> = { [K in keyof S]?: boolean }
type ClassNameObjectMap<S> = object & ClassNameMap<S>;
type ClassNameArg<S> = ClassName<S> | ClassNameObjectMap<S>;
export function css<S extends { [K in keyof S]: string }>(styles: S, ...classNames: ClassNameArg<S>[]): string {
const args = classNames.map(arg => {
if (arg == null) {
return null;
}
if (typeof arg == "string") {
return styles[arg];
}
if (typeof arg == "object") {
return Object.keys(arg).reduce<ClassNameObject>((obj: ClassNameObject, key: keyof S) => {
const exportedClassName = styles[key];
obj[exportedClassName] = (arg as ClassNameMap<S>)[key];
return obj;
}, {});
}
});
return "";
}