Accept new baselines

This commit is contained in:
Anders Hejlsberg
2018-05-21 16:44:03 -07:00
parent 9d4096f9c4
commit b31c414a31
3 changed files with 377 additions and 44 deletions

View File

@@ -60,6 +60,18 @@ function f5() {
let v4 = c4;
}
declare function widening<T>(x: T): T;
declare function nonWidening<T extends string | number | symbol>(x: T): T;
function f6(cond: boolean) {
let x1 = widening('a');
let x2 = widening(10);
let x3 = widening(cond ? 'a' : 10);
let y1 = nonWidening('a');
let y2 = nonWidening(10);
let y3 = nonWidening(cond ? 'a' : 10);
}
// Repro from #10898
type FAILURE = "FAILURE";
@@ -95,10 +107,33 @@ type TestEvent = "onmouseover" | "onmouseout";
function onMouseOver(): TestEvent { return "onmouseover"; }
let x = onMouseOver();
let x = onMouseOver();
// Repro from #23649
export function Set<K extends string>(...keys: K[]): Record<K, true | undefined> {
const result = {} as Record<K, true | undefined>
keys.forEach(key => result[key] = true)
return result
}
export function keys<K extends string, V>(obj: Record<K, V>): K[] {
return Object.keys(obj) as K[]
}
type Obj = { code: LangCode }
const langCodeSet = Set('fr', 'en', 'es', 'it', 'nl')
export type LangCode = keyof typeof langCodeSet
export const langCodes = keys(langCodeSet)
const arr: Obj[] = langCodes.map(code => ({ code }))
//// [literalTypeWidening.js]
"use strict";
// Widening vs. non-widening literal types
exports.__esModule = true;
function f1() {
var c1 = "hello"; // Widening type "hello"
var v1 = c1; // Type string
@@ -153,6 +188,14 @@ function f5() {
var c4 = "foo";
var v4 = c4;
}
function f6(cond) {
var x1 = widening('a');
var x2 = widening(10);
var x3 = widening(cond ? 'a' : 10);
var y1 = nonWidening('a');
var y2 = nonWidening(10);
var y3 = nonWidening(cond ? 'a' : 10);
}
var FAILURE = "FAILURE";
function doWork() {
return FAILURE;
@@ -172,3 +215,21 @@ if (isSuccess(result)) {
}
function onMouseOver() { return "onmouseover"; }
var x = onMouseOver();
// Repro from #23649
function Set() {
var keys = [];
for (var _i = 0; _i < arguments.length; _i++) {
keys[_i] = arguments[_i];
}
var result = {};
keys.forEach(function (key) { return result[key] = true; });
return result;
}
exports.Set = Set;
function keys(obj) {
return Object.keys(obj);
}
exports.keys = keys;
var langCodeSet = Set('fr', 'en', 'es', 'it', 'nl');
exports.langCodes = keys(langCodeSet);
var arr = exports.langCodes.map(function (code) { return ({ code: code }); });

View File

@@ -197,89 +197,206 @@ function f5() {
>c4 : Symbol(c4, Decl(literalTypeWidening.ts, 57, 9))
}
declare function widening<T>(x: T): T;
>widening : Symbol(widening, Decl(literalTypeWidening.ts, 59, 1))
>T : Symbol(T, Decl(literalTypeWidening.ts, 61, 26))
>x : Symbol(x, Decl(literalTypeWidening.ts, 61, 29))
>T : Symbol(T, Decl(literalTypeWidening.ts, 61, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 61, 26))
declare function nonWidening<T extends string | number | symbol>(x: T): T;
>nonWidening : Symbol(nonWidening, Decl(literalTypeWidening.ts, 61, 38))
>T : Symbol(T, Decl(literalTypeWidening.ts, 62, 29))
>x : Symbol(x, Decl(literalTypeWidening.ts, 62, 65))
>T : Symbol(T, Decl(literalTypeWidening.ts, 62, 29))
>T : Symbol(T, Decl(literalTypeWidening.ts, 62, 29))
function f6(cond: boolean) {
>f6 : Symbol(f6, Decl(literalTypeWidening.ts, 62, 74))
>cond : Symbol(cond, Decl(literalTypeWidening.ts, 64, 12))
let x1 = widening('a');
>x1 : Symbol(x1, Decl(literalTypeWidening.ts, 65, 7))
>widening : Symbol(widening, Decl(literalTypeWidening.ts, 59, 1))
let x2 = widening(10);
>x2 : Symbol(x2, Decl(literalTypeWidening.ts, 66, 7))
>widening : Symbol(widening, Decl(literalTypeWidening.ts, 59, 1))
let x3 = widening(cond ? 'a' : 10);
>x3 : Symbol(x3, Decl(literalTypeWidening.ts, 67, 7))
>widening : Symbol(widening, Decl(literalTypeWidening.ts, 59, 1))
>cond : Symbol(cond, Decl(literalTypeWidening.ts, 64, 12))
let y1 = nonWidening('a');
>y1 : Symbol(y1, Decl(literalTypeWidening.ts, 68, 7))
>nonWidening : Symbol(nonWidening, Decl(literalTypeWidening.ts, 61, 38))
let y2 = nonWidening(10);
>y2 : Symbol(y2, Decl(literalTypeWidening.ts, 69, 7))
>nonWidening : Symbol(nonWidening, Decl(literalTypeWidening.ts, 61, 38))
let y3 = nonWidening(cond ? 'a' : 10);
>y3 : Symbol(y3, Decl(literalTypeWidening.ts, 70, 7))
>nonWidening : Symbol(nonWidening, Decl(literalTypeWidening.ts, 61, 38))
>cond : Symbol(cond, Decl(literalTypeWidening.ts, 64, 12))
}
// Repro from #10898
type FAILURE = "FAILURE";
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 71, 1), Decl(literalTypeWidening.ts, 76, 5))
const FAILURE = "FAILURE";
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 71, 1), Decl(literalTypeWidening.ts, 76, 5))
type Result<T> = T | FAILURE;
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 66, 12))
>T : Symbol(T, Decl(literalTypeWidening.ts, 66, 12))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 76, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 78, 12))
>T : Symbol(T, Decl(literalTypeWidening.ts, 78, 12))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 71, 1), Decl(literalTypeWidening.ts, 76, 5))
function doWork<T>(): Result<T> {
>doWork : Symbol(doWork, Decl(literalTypeWidening.ts, 66, 29))
>T : Symbol(T, Decl(literalTypeWidening.ts, 68, 16))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 68, 16))
>doWork : Symbol(doWork, Decl(literalTypeWidening.ts, 78, 29))
>T : Symbol(T, Decl(literalTypeWidening.ts, 80, 16))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 76, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 80, 16))
return FAILURE;
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 71, 1), Decl(literalTypeWidening.ts, 76, 5))
}
function isSuccess<T>(result: Result<T>): result is T {
>isSuccess : Symbol(isSuccess, Decl(literalTypeWidening.ts, 70, 1))
>T : Symbol(T, Decl(literalTypeWidening.ts, 72, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 72, 22))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 72, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 72, 22))
>T : Symbol(T, Decl(literalTypeWidening.ts, 72, 19))
>isSuccess : Symbol(isSuccess, Decl(literalTypeWidening.ts, 82, 1))
>T : Symbol(T, Decl(literalTypeWidening.ts, 84, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 22))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 76, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 84, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 22))
>T : Symbol(T, Decl(literalTypeWidening.ts, 84, 19))
return !isFailure(result);
>isFailure : Symbol(isFailure, Decl(literalTypeWidening.ts, 74, 1))
>result : Symbol(result, Decl(literalTypeWidening.ts, 72, 22))
>isFailure : Symbol(isFailure, Decl(literalTypeWidening.ts, 86, 1))
>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 22))
}
function isFailure<T>(result: Result<T>): result is FAILURE {
>isFailure : Symbol(isFailure, Decl(literalTypeWidening.ts, 74, 1))
>T : Symbol(T, Decl(literalTypeWidening.ts, 76, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 76, 22))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 64, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 76, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 76, 22))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5))
>isFailure : Symbol(isFailure, Decl(literalTypeWidening.ts, 86, 1))
>T : Symbol(T, Decl(literalTypeWidening.ts, 88, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 88, 22))
>Result : Symbol(Result, Decl(literalTypeWidening.ts, 76, 26))
>T : Symbol(T, Decl(literalTypeWidening.ts, 88, 19))
>result : Symbol(result, Decl(literalTypeWidening.ts, 88, 22))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 71, 1), Decl(literalTypeWidening.ts, 76, 5))
return result === FAILURE;
>result : Symbol(result, Decl(literalTypeWidening.ts, 76, 22))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 59, 1), Decl(literalTypeWidening.ts, 64, 5))
>result : Symbol(result, Decl(literalTypeWidening.ts, 88, 22))
>FAILURE : Symbol(FAILURE, Decl(literalTypeWidening.ts, 71, 1), Decl(literalTypeWidening.ts, 76, 5))
}
function increment(x: number): number {
>increment : Symbol(increment, Decl(literalTypeWidening.ts, 78, 1))
>x : Symbol(x, Decl(literalTypeWidening.ts, 80, 19))
>increment : Symbol(increment, Decl(literalTypeWidening.ts, 90, 1))
>x : Symbol(x, Decl(literalTypeWidening.ts, 92, 19))
return x + 1;
>x : Symbol(x, Decl(literalTypeWidening.ts, 80, 19))
>x : Symbol(x, Decl(literalTypeWidening.ts, 92, 19))
}
let result = doWork<number>();
>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 3))
>doWork : Symbol(doWork, Decl(literalTypeWidening.ts, 66, 29))
>result : Symbol(result, Decl(literalTypeWidening.ts, 96, 3))
>doWork : Symbol(doWork, Decl(literalTypeWidening.ts, 78, 29))
if (isSuccess(result)) {
>isSuccess : Symbol(isSuccess, Decl(literalTypeWidening.ts, 70, 1))
>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 3))
>isSuccess : Symbol(isSuccess, Decl(literalTypeWidening.ts, 82, 1))
>result : Symbol(result, Decl(literalTypeWidening.ts, 96, 3))
increment(result);
>increment : Symbol(increment, Decl(literalTypeWidening.ts, 78, 1))
>result : Symbol(result, Decl(literalTypeWidening.ts, 84, 3))
>increment : Symbol(increment, Decl(literalTypeWidening.ts, 90, 1))
>result : Symbol(result, Decl(literalTypeWidening.ts, 96, 3))
}
// Repro from #10898
type TestEvent = "onmouseover" | "onmouseout";
>TestEvent : Symbol(TestEvent, Decl(literalTypeWidening.ts, 88, 1))
>TestEvent : Symbol(TestEvent, Decl(literalTypeWidening.ts, 100, 1))
function onMouseOver(): TestEvent { return "onmouseover"; }
>onMouseOver : Symbol(onMouseOver, Decl(literalTypeWidening.ts, 92, 46))
>TestEvent : Symbol(TestEvent, Decl(literalTypeWidening.ts, 88, 1))
>onMouseOver : Symbol(onMouseOver, Decl(literalTypeWidening.ts, 104, 46))
>TestEvent : Symbol(TestEvent, Decl(literalTypeWidening.ts, 100, 1))
let x = onMouseOver();
>x : Symbol(x, Decl(literalTypeWidening.ts, 96, 3))
>onMouseOver : Symbol(onMouseOver, Decl(literalTypeWidening.ts, 92, 46))
>x : Symbol(x, Decl(literalTypeWidening.ts, 108, 3))
>onMouseOver : Symbol(onMouseOver, Decl(literalTypeWidening.ts, 104, 46))
// Repro from #23649
export function Set<K extends string>(...keys: K[]): Record<K, true | undefined> {
>Set : Symbol(Set, Decl(literalTypeWidening.ts, 108, 22))
>K : Symbol(K, Decl(literalTypeWidening.ts, 112, 20))
>keys : Symbol(keys, Decl(literalTypeWidening.ts, 112, 38))
>K : Symbol(K, Decl(literalTypeWidening.ts, 112, 20))
>Record : Symbol(Record, Decl(lib.d.ts, --, --))
>K : Symbol(K, Decl(literalTypeWidening.ts, 112, 20))
const result = {} as Record<K, true | undefined>
>result : Symbol(result, Decl(literalTypeWidening.ts, 113, 7))
>Record : Symbol(Record, Decl(lib.d.ts, --, --))
>K : Symbol(K, Decl(literalTypeWidening.ts, 112, 20))
keys.forEach(key => result[key] = true)
>keys.forEach : Symbol(Array.forEach, Decl(lib.d.ts, --, --))
>keys : Symbol(keys, Decl(literalTypeWidening.ts, 112, 38))
>forEach : Symbol(Array.forEach, Decl(lib.d.ts, --, --))
>key : Symbol(key, Decl(literalTypeWidening.ts, 114, 15))
>result : Symbol(result, Decl(literalTypeWidening.ts, 113, 7))
>key : Symbol(key, Decl(literalTypeWidening.ts, 114, 15))
return result
>result : Symbol(result, Decl(literalTypeWidening.ts, 113, 7))
}
export function keys<K extends string, V>(obj: Record<K, V>): K[] {
>keys : Symbol(keys, Decl(literalTypeWidening.ts, 116, 1))
>K : Symbol(K, Decl(literalTypeWidening.ts, 118, 21))
>V : Symbol(V, Decl(literalTypeWidening.ts, 118, 38))
>obj : Symbol(obj, Decl(literalTypeWidening.ts, 118, 42))
>Record : Symbol(Record, Decl(lib.d.ts, --, --))
>K : Symbol(K, Decl(literalTypeWidening.ts, 118, 21))
>V : Symbol(V, Decl(literalTypeWidening.ts, 118, 38))
>K : Symbol(K, Decl(literalTypeWidening.ts, 118, 21))
return Object.keys(obj) as K[]
>Object.keys : Symbol(ObjectConstructor.keys, Decl(lib.d.ts, --, --))
>Object : Symbol(Object, Decl(lib.d.ts, --, --), Decl(lib.d.ts, --, --))
>keys : Symbol(ObjectConstructor.keys, Decl(lib.d.ts, --, --))
>obj : Symbol(obj, Decl(literalTypeWidening.ts, 118, 42))
>K : Symbol(K, Decl(literalTypeWidening.ts, 118, 21))
}
type Obj = { code: LangCode }
>Obj : Symbol(Obj, Decl(literalTypeWidening.ts, 120, 1))
>code : Symbol(code, Decl(literalTypeWidening.ts, 122, 12))
>LangCode : Symbol(LangCode, Decl(literalTypeWidening.ts, 124, 53))
const langCodeSet = Set('fr', 'en', 'es', 'it', 'nl')
>langCodeSet : Symbol(langCodeSet, Decl(literalTypeWidening.ts, 124, 5))
>Set : Symbol(Set, Decl(literalTypeWidening.ts, 108, 22))
export type LangCode = keyof typeof langCodeSet
>LangCode : Symbol(LangCode, Decl(literalTypeWidening.ts, 124, 53))
>langCodeSet : Symbol(langCodeSet, Decl(literalTypeWidening.ts, 124, 5))
export const langCodes = keys(langCodeSet)
>langCodes : Symbol(langCodes, Decl(literalTypeWidening.ts, 126, 12))
>keys : Symbol(keys, Decl(literalTypeWidening.ts, 116, 1))
>langCodeSet : Symbol(langCodeSet, Decl(literalTypeWidening.ts, 124, 5))
const arr: Obj[] = langCodes.map(code => ({ code }))
>arr : Symbol(arr, Decl(literalTypeWidening.ts, 128, 5))
>Obj : Symbol(Obj, Decl(literalTypeWidening.ts, 120, 1))
>langCodes.map : Symbol(Array.map, Decl(lib.d.ts, --, --))
>langCodes : Symbol(langCodes, Decl(literalTypeWidening.ts, 126, 12))
>map : Symbol(Array.map, Decl(lib.d.ts, --, --))
>code : Symbol(code, Decl(literalTypeWidening.ts, 128, 33))
>code : Symbol(code, Decl(literalTypeWidening.ts, 128, 43))

View File

@@ -219,6 +219,67 @@ function f5() {
>c4 : "foo"
}
declare function widening<T>(x: T): T;
>widening : <T>(x: T) => T
>T : T
>x : T
>T : T
>T : T
declare function nonWidening<T extends string | number | symbol>(x: T): T;
>nonWidening : <T extends string | number | symbol>(x: T) => T
>T : T
>x : T
>T : T
>T : T
function f6(cond: boolean) {
>f6 : (cond: boolean) => void
>cond : boolean
let x1 = widening('a');
>x1 : string
>widening('a') : "a"
>widening : <T>(x: T) => T
>'a' : "a"
let x2 = widening(10);
>x2 : number
>widening(10) : 10
>widening : <T>(x: T) => T
>10 : 10
let x3 = widening(cond ? 'a' : 10);
>x3 : string | number
>widening(cond ? 'a' : 10) : "a" | 10
>widening : <T>(x: T) => T
>cond ? 'a' : 10 : "a" | 10
>cond : boolean
>'a' : "a"
>10 : 10
let y1 = nonWidening('a');
>y1 : "a"
>nonWidening('a') : "a"
>nonWidening : <T extends string | number | symbol>(x: T) => T
>'a' : "a"
let y2 = nonWidening(10);
>y2 : 10
>nonWidening(10) : 10
>nonWidening : <T extends string | number | symbol>(x: T) => T
>10 : 10
let y3 = nonWidening(cond ? 'a' : 10);
>y3 : "a" | 10
>nonWidening(cond ? 'a' : 10) : "a" | 10
>nonWidening : <T extends string | number | symbol>(x: T) => T
>cond ? 'a' : 10 : "a" | 10
>cond : boolean
>'a' : "a"
>10 : 10
}
// Repro from #10898
type FAILURE = "FAILURE";
@@ -316,3 +377,97 @@ let x = onMouseOver();
>onMouseOver() : TestEvent
>onMouseOver : () => TestEvent
// Repro from #23649
export function Set<K extends string>(...keys: K[]): Record<K, true | undefined> {
>Set : <K extends string>(...keys: K[]) => Record<K, true>
>K : K
>keys : K[]
>K : K
>Record : Record<K, T>
>K : K
>true : true
const result = {} as Record<K, true | undefined>
>result : Record<K, true>
>{} as Record<K, true | undefined> : Record<K, true>
>{} : {}
>Record : Record<K, T>
>K : K
>true : true
keys.forEach(key => result[key] = true)
>keys.forEach(key => result[key] = true) : void
>keys.forEach : (callbackfn: (value: K, index: number, array: K[]) => void, thisArg?: any) => void
>keys : K[]
>forEach : (callbackfn: (value: K, index: number, array: K[]) => void, thisArg?: any) => void
>key => result[key] = true : (key: K) => boolean
>key : K
>result[key] = true : true
>result[key] : Record<K, true>[K]
>result : Record<K, true>
>key : K
>true : true
return result
>result : Record<K, true>
}
export function keys<K extends string, V>(obj: Record<K, V>): K[] {
>keys : <K extends string, V>(obj: Record<K, V>) => K[]
>K : K
>V : V
>obj : Record<K, V>
>Record : Record<K, T>
>K : K
>V : V
>K : K
return Object.keys(obj) as K[]
>Object.keys(obj) as K[] : K[]
>Object.keys(obj) : string[]
>Object.keys : (o: {}) => string[]
>Object : ObjectConstructor
>keys : (o: {}) => string[]
>obj : Record<K, V>
>K : K
}
type Obj = { code: LangCode }
>Obj : Obj
>code : "fr" | "en" | "es" | "it" | "nl"
>LangCode : "fr" | "en" | "es" | "it" | "nl"
const langCodeSet = Set('fr', 'en', 'es', 'it', 'nl')
>langCodeSet : Record<"fr" | "en" | "es" | "it" | "nl", true>
>Set('fr', 'en', 'es', 'it', 'nl') : Record<"fr" | "en" | "es" | "it" | "nl", true>
>Set : <K extends string>(...keys: K[]) => Record<K, true>
>'fr' : "fr"
>'en' : "en"
>'es' : "es"
>'it' : "it"
>'nl' : "nl"
export type LangCode = keyof typeof langCodeSet
>LangCode : "fr" | "en" | "es" | "it" | "nl"
>langCodeSet : Record<"fr" | "en" | "es" | "it" | "nl", true>
export const langCodes = keys(langCodeSet)
>langCodes : ("fr" | "en" | "es" | "it" | "nl")[]
>keys(langCodeSet) : ("fr" | "en" | "es" | "it" | "nl")[]
>keys : <K extends string, V>(obj: Record<K, V>) => K[]
>langCodeSet : Record<"fr" | "en" | "es" | "it" | "nl", true>
const arr: Obj[] = langCodes.map(code => ({ code }))
>arr : Obj[]
>Obj : Obj
>langCodes.map(code => ({ code })) : { code: "fr" | "en" | "es" | "it" | "nl"; }[]
>langCodes.map : <U>(callbackfn: (value: "fr" | "en" | "es" | "it" | "nl", index: number, array: ("fr" | "en" | "es" | "it" | "nl")[]) => U, thisArg?: any) => U[]
>langCodes : ("fr" | "en" | "es" | "it" | "nl")[]
>map : <U>(callbackfn: (value: "fr" | "en" | "es" | "it" | "nl", index: number, array: ("fr" | "en" | "es" | "it" | "nl")[]) => U, thisArg?: any) => U[]
>code => ({ code }) : (code: "fr" | "en" | "es" | "it" | "nl") => { code: "fr" | "en" | "es" | "it" | "nl"; }
>code : "fr" | "en" | "es" | "it" | "nl"
>({ code }) : { code: "fr" | "en" | "es" | "it" | "nl"; }
>{ code } : { code: "fr" | "en" | "es" | "it" | "nl"; }
>code : "fr" | "en" | "es" | "it" | "nl"