microsoft / microsoft/TypeScript
Functions with same intersection and conditional type in parameter list not assignable to each other
Nessuno ha ancora preso questa issue.
- Lingua principale
- Go
- Stelle
- 111k
- Fork
- 14.3k
- Merge medio
- 1g 19h
- PR unite (30g)
- 117
Descrizione
TypeScript Version: 3.5.1
Search Terms:
function, intersection, conditional type, parameter list, assignable
Code
/**
* We should never be able to create a value of this type legitimately.
*
* `ErrorMessageT` is our error message
*/
interface CompileError<ErrorMessageT extends any[]> {
/**
* There should never be a value of this type
*/
readonly __compileError : never;
}
type ErrorA = CompileError<["I am error A"]>;
type ErrorB = CompileError<["I am error B"]>;
declare const errorA : ErrorA;
/**
* Different compile errors are assignable to each other.
*/
const errorB : ErrorB = errorA;
/**
* Pretend this is `v1.0.0` of your library.
*/
declare function foo <N extends number> (
/**
* This is how we use `CompileError<>` to prevent `3` from being
* a parameter
*/
n : (
N &
(Extract<3, N> extends never ?
unknown :
CompileError<[3, "is not allowed; received", N]>)
)
) : void;
/**
* Argument of type '3' is not assignable to parameter of type
* 'CompileError<[3, "is not allowed; received", 3]>'.
*/
foo(3);
/**
* OK!
*/
foo(5);
/**
* Argument of type '3 | 5' is not assignable to parameter of type
* 'CompileError<[3, "is not allowed; received", 3 | 5]>'.
*/
foo(5 as 3|5);
/**
* Argument of type 'number' is not assignable to parameter of type
* 'CompileError<[3, "is not allowed; received", number]>'.
*/
foo(5 as number);
///////////////////////////////////////////////////////////////////
/**
* The same as `foo<>()` but with a different error message.
*
* Pretend this is `v1.1.0` of your library.
*/
declare function bar <N extends number> (
n : (
N &
(Extract<3, N> extends never ?
unknown :
CompileError<[3, "is not allowed; received", N]>)
)
) : void;
/**
* Expected: Assignable to each other
* Actual: Not assignable to each other
*/
const fooIsAssignableToBar : typeof bar = foo;
const barIsAssignableToFoo : typeof foo = bar;
Expected behavior:
The following should have no errors,
const fooIsAssignableToBar : typeof bar = foo;
const barIsAssignableToFoo : typeof foo = bar;
Actual behavior:
It has errors
Playground Link:
Related Issues:
https://github.com/microsoft/TypeScript/issues/21756
Also, related to my comment here,
https://github.com/microsoft/TypeScript/issues/23689#issuecomment-512114782
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 con la riproduzione collegata in TypeScript Playground e verifica il comportamento usando l'esempio TypeScript 3.5.1 segnalato. Leggi le issue correlate 21756 e 23689 per il contesto sull'assegnabilità e sui tipi condizionali. Il lavoro è completato quando le due assegnazioni di funzioni non producono errori, mentre foo(3), foo(5) e i casi diagnostici correlati mantengono il comportamento previsto.
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
- 42/100