Repository: TypeScript
Issue: Mapped types created from reverse mapped types with union/intersection constraints don't have declaration linked
Labels: Help Wanted,Possible Improvement

### 🔎 Search Terms

reverse mapped type go to definition union intersection constraint declarations

### 🕗 Version & Regression Information

- This is the behavior in every version I tried

### ⏯ Playground Link

https://www.typescriptlang.org/play?ts=5.4.0-dev.20240128#code/C4TwDgpgBAysBOBLAxsA8mYiD2A7AcgIYC20AvFAES7YCSxYANiosAIK4iVQA+VAzghTB8AV0aMAwgAsIyANb9KAbgBQiXMAjwAZoWTRJ2BokbaMWPPygBvVVAdRE-bI0JaAJgFlsH8RH4AfgAuKAAjbFcIQlw1RygaeiYWdk4Q8MizGLjHQSRUdIio7PtcoVQxCRk5RULM6NjShwA3bTD3RGIfPzMYEE1CAA864saAX1VQSCgjEzN4CxxcAGkIEGsKeTXsHVsmqABtZadcKC2QHZnjMFNzTCXrQms8jQBzKAhBrVwPa2PAhIQVrwKChZYAXVCMRAajGag8cjc8GgOlEuFQSygrwgwDg+XQ9zwADVCIxRBAABTIa63BaE3D8UKzG7zRZWAA0UB0bleoTxwjZBBIEAAlKEillGgjkEiUWiMXgoMhke4IMzRJ5mbTBfwADwAFQ+XwgP2sACU5Nh4B5dS9cK9OVrWfTVusDuCAHweinYemMvbxI4nKAU86XQ0AMiuczulhWa34It4sHKBLjRFIkID8UcCMgPxNyEQAVC+qO4JyOaV1w1EBJZIgoSpNOdcf9AAUUPJdU7Yw9Occ+GWIQdcKJiGFtJ6k2QPVAAKKDGWiBE9lt9qzlzlohE6DQQDweytQOGqMZiqBTCCXX1ttSqakM4DVhi1jxQCjK6JadWa9d0tsKTsBxnFcVVvF8fx-WA3MIHzBF0WLf0DkoYF2iwLpIN6fpgCGShwXZfZqVfLR63JJtiJZDcGRnOcYPiZFgFEeBTgAQlYil9niSjtT9AA6UC3E8booN4PgeNbB4+LQjpMJ6CA+gGQYuKgEVjzGQiHA00pEgYZgi1SEBQnoqA8xNBCixLQ5KBeVB8M0xxKNrMjGxDCTqMTD86JUxjmNObFcVTQUXObGMAP7KhdOSAyOC4NT9m0rSHNskRxCkWQFGg-YzILRCrJQlL7KImtSNJci3P-HVaOzBicT8rEcX5VBgrKyl3PCjkBFTSp0pqJR4viRKT0I8970fQQGuAWh+GmsDhKwgIPxfMA3wElwhIPESzH4AB6AAqABGPadr4pzSobVRLquq6gA

### 💻 Code

```ts
type StrictOptionName = "noImplicitAny" | "strictNullChecks";
interface CompilerOptions {
    isolatedModules?: boolean;
    noImplicitAny?: boolean;
    strict?: boolean;
    strictNullChecks?: boolean;
    verbatimModuleSyntax?: boolean;
}
type CompilerOptionKeys = keyof {
    [K in keyof CompilerOptions as string extends K ? never : K]: any;
};
declare function getStrictOptionValue(compilerOptions: CompilerOptions, flag: StrictOptionName): boolean;
declare function createComputedCompilerOptions<T extends Record<string, CompilerOptionKeys[]>>(options: {
    [K in (keyof T & CompilerOptionKeys) | StrictOptionName]: {
        dependencies: T[K];
        computeValue: (compilerOptions: Pick<CompilerOptions, K | T[K][number]>) => Exclude<CompilerOptions[K], undefined>;
    };
}): typeof options;

const computed = createComputedCompilerOptions({
  isolatedModules: {
    dependencies: ["verbatimModuleSyntax"],
    computeValue: (compilerOptions) => {
      return !!(
        compilerOptions.isolatedModules || compilerOptions.verbatimModuleSyntax
      );
    },
  },
  noImplicitAny: {
    dependencies: ["strict"],
    computeValue: (compilerOptions) => {
      return getStrictOptionValue(compilerOptions, "noImplicitAny");
    },
  },
  strictNullChecks: {
    dependencies: ["strict"],
    computeValue: (compilerOptions) => {
      return getStrictOptionValue(compilerOptions, "strictNullChecks");
    },
  },
});

const getIsIsolatedModules = computed.isolatedModules/*1*/.computeValue
```


### 🙁 Actual behavior

Go to definition doesn't go anywhere at marker 1

### 🙂 Expected behavior

Go to definition should go to the property at the line 21

### Additional information about the issue

`modifiersType` for this mapped type is `unknown`. I think that potentially the modifiers type when iterating over any reverse mapped type (when `reversed.mappedType === (mappedType.target || mappedType)` could use that `reversed.source` as the modifiers type. If not that then at least declarations could be outsourced to that type for linking properties.