Handle intersections in isGenericTypeWithoutNullableConstraint (#50497)

* Handle intersections in isGenericTypeWithoutNullableConstraint

* Add regression test
This commit is contained in:
Anders Hejlsberg 2022-08-29 09:24:13 -07:00 committed by GitHub
parent ed6889cd5b
commit 6d170b490d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 76 additions and 2 deletions

View File

@ -25789,8 +25789,10 @@ namespace ts {
!!(type.flags & TypeFlags.Instantiable && getBaseConstraintOrType(type).flags & (TypeFlags.Nullable | TypeFlags.Union));
}
function isGenericTypeWithoutNullableConstraint(type: Type) {
return !!(type.flags & TypeFlags.Instantiable && !maybeTypeOfKind(getBaseConstraintOrType(type), TypeFlags.Nullable));
function isGenericTypeWithoutNullableConstraint(type: Type): boolean {
return type.flags & TypeFlags.Intersection ?
some((type as IntersectionType).types, isGenericTypeWithoutNullableConstraint) :
!!(type.flags & TypeFlags.Instantiable && !maybeTypeOfKind(getBaseConstraintOrType(type), TypeFlags.Nullable));
}
function hasContextualTypeWithNoGenericTypes(node: Node, checkMode: CheckMode | undefined) {

View File

@ -240,4 +240,12 @@ tests/cases/conformance/controlFlow/controlFlowGenericTypes.ts(168,9): error TS2
control[key] = value;
}
}
// Repro from #50465
type Column<T> = (keyof T extends never ? { id?: number | string } : { id: T }) & { title?: string; }
function getColumnProperty<T>(column: Column<T>, key: keyof Column<T>) {
return column[key];
}

View File

@ -210,6 +210,14 @@ function update<T extends Control, K extends keyof T>(control : T | undefined, k
control[key] = value;
}
}
// Repro from #50465
type Column<T> = (keyof T extends never ? { id?: number | string } : { id: T }) & { title?: string; }
function getColumnProperty<T>(column: Column<T>, key: keyof Column<T>) {
return column[key];
}
//// [controlFlowGenericTypes.js]
@ -368,3 +376,6 @@ function update(control, key, value) {
control[key] = value;
}
}
function getColumnProperty(column, key) {
return column[key];
}

View File

@ -626,3 +626,29 @@ function update<T extends Control, K extends keyof T>(control : T | undefined, k
}
}
// Repro from #50465
type Column<T> = (keyof T extends never ? { id?: number | string } : { id: T }) & { title?: string; }
>Column : Symbol(Column, Decl(controlFlowGenericTypes.ts, 210, 1))
>T : Symbol(T, Decl(controlFlowGenericTypes.ts, 214, 12))
>T : Symbol(T, Decl(controlFlowGenericTypes.ts, 214, 12))
>id : Symbol(id, Decl(controlFlowGenericTypes.ts, 214, 43))
>id : Symbol(id, Decl(controlFlowGenericTypes.ts, 214, 70))
>T : Symbol(T, Decl(controlFlowGenericTypes.ts, 214, 12))
>title : Symbol(title, Decl(controlFlowGenericTypes.ts, 214, 83))
function getColumnProperty<T>(column: Column<T>, key: keyof Column<T>) {
>getColumnProperty : Symbol(getColumnProperty, Decl(controlFlowGenericTypes.ts, 214, 101))
>T : Symbol(T, Decl(controlFlowGenericTypes.ts, 216, 27))
>column : Symbol(column, Decl(controlFlowGenericTypes.ts, 216, 30))
>Column : Symbol(Column, Decl(controlFlowGenericTypes.ts, 210, 1))
>T : Symbol(T, Decl(controlFlowGenericTypes.ts, 216, 27))
>key : Symbol(key, Decl(controlFlowGenericTypes.ts, 216, 48))
>Column : Symbol(Column, Decl(controlFlowGenericTypes.ts, 210, 1))
>T : Symbol(T, Decl(controlFlowGenericTypes.ts, 216, 27))
return column[key];
>column : Symbol(column, Decl(controlFlowGenericTypes.ts, 216, 30))
>key : Symbol(key, Decl(controlFlowGenericTypes.ts, 216, 48))
}

View File

@ -583,3 +583,22 @@ function update<T extends Control, K extends keyof T>(control : T | undefined, k
}
}
// Repro from #50465
type Column<T> = (keyof T extends never ? { id?: number | string } : { id: T }) & { title?: string; }
>Column : Column<T>
>id : string | number | undefined
>id : T
>title : string | undefined
function getColumnProperty<T>(column: Column<T>, key: keyof Column<T>) {
>getColumnProperty : <T>(column: Column<T>, key: keyof Column<T>) => Column<T>["title" | keyof (keyof T extends never ? { id?: string | number | undefined; } : { id: T; })]
>column : Column<T>
>key : "title" | keyof (keyof T extends never ? { id?: string | number | undefined; } : { id: T; })
return column[key];
>column[key] : Column<T>["title" | keyof (keyof T extends never ? { id?: string | number | undefined; } : { id: T; })]
>column : Column<T>
>key : "title" | keyof (keyof T extends never ? { id?: string | number | undefined; } : { id: T; })
}

View File

@ -211,3 +211,11 @@ function update<T extends Control, K extends keyof T>(control : T | undefined, k
control[key] = value;
}
}
// Repro from #50465
type Column<T> = (keyof T extends never ? { id?: number | string } : { id: T }) & { title?: string; }
function getColumnProperty<T>(column: Column<T>, key: keyof Column<T>) {
return column[key];
}