mirror of
https://github.com/microsoft/TypeScript.git
synced 2026-02-05 16:38:05 -06:00
Fixed symbol declarations for generic filtering mapped types (#53207)
This commit is contained in:
parent
78089b4964
commit
eb6aaea86e
@ -13219,9 +13219,10 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
// and T as the template type.
|
||||
const typeParameter = getTypeParameterFromMappedType(type);
|
||||
const constraintType = getConstraintTypeFromMappedType(type);
|
||||
const nameType = getNameTypeFromMappedType(type.target as MappedType || type);
|
||||
const isFilteringMappedType = nameType && isTypeAssignableTo(nameType, typeParameter);
|
||||
const templateType = getTemplateTypeFromMappedType(type.target as MappedType || type);
|
||||
const mappedType = (type.target as MappedType) || type;
|
||||
const nameType = getNameTypeFromMappedType(mappedType);
|
||||
const shouldLinkPropDeclarations = !nameType || isFilteringMappedType(mappedType);
|
||||
const templateType = getTemplateTypeFromMappedType(mappedType);
|
||||
const modifiersType = getApparentType(getModifiersTypeFromMappedType(type)); // The 'T' in 'keyof T'
|
||||
const templateModifiers = getMappedTypeModifiers(type);
|
||||
const include = keyofStringsOnly ? TypeFlags.StringLiteral : TypeFlags.StringOrNumberLiteralOrUnique;
|
||||
@ -13267,7 +13268,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
prop.links.keyType = keyType;
|
||||
if (modifiersProp) {
|
||||
prop.links.syntheticOrigin = modifiersProp;
|
||||
prop.declarations = !nameType || isFilteringMappedType ? modifiersProp.declarations : undefined;
|
||||
prop.declarations = shouldLinkPropDeclarations ? modifiersProp.declarations : undefined;
|
||||
}
|
||||
members.set(propName, prop);
|
||||
}
|
||||
@ -13400,6 +13401,11 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
return false;
|
||||
}
|
||||
|
||||
function isFilteringMappedType(type: MappedType): boolean {
|
||||
const nameType = getNameTypeFromMappedType(type);
|
||||
return !!nameType && isTypeAssignableTo(nameType, getTypeParameterFromMappedType(type));
|
||||
}
|
||||
|
||||
function resolveStructuredTypeMembers(type: StructuredType): ResolvedType {
|
||||
if (!(type as ResolvedType).members) {
|
||||
if (type.flags & TypeFlags.Object) {
|
||||
@ -17528,8 +17534,7 @@ export function createTypeChecker(host: TypeCheckerHost): TypeChecker {
|
||||
// K is generic and N is assignable to P, instantiate E using a mapper that substitutes the index type for P.
|
||||
// For example, for an index access { [P in K]: Box<T[P]> }[X], we construct the type Box<T[X]>.
|
||||
if (isGenericMappedType(objectType)) {
|
||||
const nameType = getNameTypeFromMappedType(objectType);
|
||||
if (!nameType || isTypeAssignableTo(nameType, getTypeParameterFromMappedType(objectType))) {
|
||||
if (!getNameTypeFromMappedType(objectType) || isFilteringMappedType(objectType)) {
|
||||
return type[cache] = mapType(substituteIndexedMappedType(objectType, type.indexType), t => getSimplifiedType(t, writing));
|
||||
}
|
||||
}
|
||||
|
||||
@ -0,0 +1,25 @@
|
||||
///<reference path="fourslash.ts"/>
|
||||
|
||||
//// const obj = {
|
||||
//// get /*def*/id() {
|
||||
//// return 1;
|
||||
//// },
|
||||
//// name: "test",
|
||||
//// };
|
||||
////
|
||||
//// type Omit2<T, DroppedKeys extends PropertyKey> = {
|
||||
//// [K in keyof T as Exclude<K, DroppedKeys>]: T[K];
|
||||
//// };
|
||||
////
|
||||
//// declare function omit2<O, Mask extends { [K in keyof O]?: true }>(
|
||||
//// obj: O,
|
||||
//// mask: Mask
|
||||
//// ): Omit2<O, keyof Mask>;
|
||||
////
|
||||
//// const obj2 = omit2(obj, {
|
||||
//// name: true,
|
||||
//// });
|
||||
////
|
||||
//// obj2.[|/*ref*/id|];
|
||||
|
||||
verify.goToDefinition("ref", "def");
|
||||
Loading…
x
Reference in New Issue
Block a user