microsoft / microsoft/TypeScript

Mapped types created from reverse mapped types with union/intersection constraints don't have declaration linked

Aperta
#57,211 0 commenti 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Domain: Mapped Types Help Wanted Possible Improvement
Lingua principale
Go
Stelle
111k
Fork
14.3k
Merge medio
1g 19h
PR unite (30g)
117

Descrizione

🔎 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
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.

Guida per i contributori

Apri la guida per i contributori

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Direzione di ricerca

Inizia con la riproduzione collegata di TypeScript Playground e ispeziona la richiesta go-to-definition al marker 1, concentrandoti sul reverse mapped type e sul relativo modifiersType. Confronta il risultato con la proprietà prevista alla riga 21. Il lavoro è completato quando go-to-definition da computed.isolatedModules.computeValue risolve alla dichiarazione di quella proprietà.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Valutazione

Stack tecnologico
typescript
Ambito
compilers
Tipo di issue
Bug
Difficoltà
4/5
Tempo stimato
3-5 giorni
Stato di attività
Ferma
Chiarezza
Abbastanza chiara
Idoneità per principianti
38/100

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.