3 votes

Comment faire respecter la conformité des types sur les paramètres de rappel ?

Comment peut-on obtenir foobar(fn) ci-dessous à l'erreur comme propriété b est absent de la arg type de paramètre de bar ?

const foo = (arg: {a: any,b: any})=>1

const foobar = <T extends typeof foo>(arg:T)=>1

const bar = (arg: {a: string})=>1

// how would one type this so that `bar` is 
// flagged as invalid, because prop `b` is missing?
foobar(bar)  

code

Pour mon cerveau humain bar ne s'étend pas foo - Je crois que cela se produit en raison de la contravariance, mais je suis encore ignorant, d'où ma question.

2voto

youdateme Points 741

Type extrêmement utile dont nous aurons besoin (de aquí ):

type Equals<T, U> =
  (<G>() => G extends T ? 1 : 2) extends
  (<G>() => G extends U ? 1 : 2) ? true : false;

Ensuite, vous pouvez simplement vérifier si T est égal au type de foo :

const foobar = <T extends typeof foo>(arg: Equals<T, typeof foo> extends true ? T : never)=>1

et s'il l'est, il devrait l'être T sinon never .

Cela semble fonctionner !

Terrain de jeux

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X