microsoft / microsoft/TypeScript
`silentNeverType` leak through return type inference
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 2g 4h
- PR unite (30g)
- 132
Descrizione
🔎 Search Terms
silent never leak reverse mapped types nested calls return type inference
🕗 Version & Regression Information
- This is the behavior in every version I tried
⏯ Playground Link
💻 Code
type Values<T> = T[keyof T];
type MachineContext = Record<string, any>;
interface ParameterizedObject {
type: string;
params?: unknown;
}
type ActionFunction<
TContext extends MachineContext,
TParams extends ParameterizedObject["params"] | undefined,
TAction extends ParameterizedObject,
> = {
(ctx: TContext, params: TParams): void;
_out_TAction?: TAction;
};
type ToParameterizedObject<
TParameterizedMap extends Record<
string,
ParameterizedObject["params"] | undefined
>,
> = Values<{
[K in keyof TParameterizedMap & string]: {
type: K;
params: TParameterizedMap[K];
};
}>;
type CollectActions<
TContext extends MachineContext,
TParams extends ParameterizedObject["params"] | undefined,
> = (
{
context,
enqueue,
}: {
context: TContext;
enqueue: (action: () => void) => void;
},
params: TParams,
) => void;
declare function enqueueActions<
TContext extends MachineContext,
TParams extends ParameterizedObject["params"] | undefined,
TAction extends ParameterizedObject = ParameterizedObject,
>(
collect: CollectActions<TContext, TParams>,
): ActionFunction<TContext, TParams, TAction>;
declare function setup<
TContext extends MachineContext,
TActions extends Record<
string,
ParameterizedObject["params"] | undefined
> = {},
>({
types,
actions,
}: {
types?: { context?: TContext };
actions?: {
[K in keyof TActions]: ActionFunction<
TContext,
TActions[K],
ToParameterizedObject<TActions>
>;
};
}): void;
setup({
actions: {
doStuff: enqueueActions((_, params: number) => {}),
},
});
setup({
actions: {
doStuff: enqueueActions((_, params: number) => {}),
doOtherStuff: (_, params: string) => {},
},
});
setup({
actions: {
doStuff: enqueueActions((_, params: number) => {}),
doOtherStuff: (_: any, params: string) => {},
},
});
🙁 Actual behavior
First 2 calls mention such a relationship check failure in the error message:
Type 'ActionFunction<MachineContext, number, { type: string; params: never; }>' is not assignable to type 'ActionFunction<MachineContext, number, { type: "doStuff"; params: number; }>'.
Notice never there. This is quite weird an unexpected as there is no never in sight here. It turns out this is a silentNeverType that leaked through.
🙂 Expected behavior
At the very least, I would expect it to error with consistent error messages mentioning unknown instead of never. Even better, if it could behave closer to a very similar version of this code: TS playground. In there the third error still errors but the first two infers nicely.
Additional information about the issue
No response
Guida per i contributori
Apri la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Direzione di ricerca
Inizia riproducendo l’esempio Playground collegato e confronta le diagnosi per le tre chiamate di configurazione, in particolare il silentNeverType trapelato nelle prime due. Traccia i percorsi coinvolti di inferenza dei tipi e verifica delle relazioni di TypeScript; il lavoro è completato quando le prime due chiamate inferiscono come previsto oppure segnalano errori coerenti basati su unknown senza esporre never.
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
- 35/100