microsoft / microsoft/TypeScript
Non‑`void` returning assertion functions
Personne n'a encore pris cette issue.
- Langage dominant
- Go
- Étoiles
- 111k
- Forks
- 14.4k
- Merge moyen
- 1 j 19 h
- PR mergées (30 j)
- 117
Description
Search Terms
- assertion function non-void return type
- assertion function non-void return
- assertion function generic return
- assertion function custom return
Suggestion
A way to type a function that is both an assertion function and returning a value that is not void.
Use Cases
This is necessary to correctly type Jest’s expect(…) matchers, which have a generic return type of R.
Examples
declare const expect: <T>(actual: T): JestMatchers<T>;
type JestMatchers<T> = JestMatchersShape<
Matchers<void, T>,
Matchers<
Promise<void>,
T extends PromiseLike<infer U>
? U
: Exclude<T, PromiseLike<any>>
>
>;
type JestMatchersShape<TNonPromise extends {} = {}, TPromise extends {} = {}> = {
resolves: AndNot<TPromise>;
rejects: AndNot<TPromise>;
} & AndNot<TNonPromise>
type AndNot<T> = T & { not: T };
interface Matchers<R, T = {}> {
toBe<E>(expected: E): R & (asserts T is E);
}
declare const foo: unknown;
expect(foo).toBe("foo");
foo; // $ExpectType "foo"
// Some typings for engine262's Completion Record handling:
type UnwrapNormalCompletion<T>
= unknown extends T ? Value | undefined
: T extends NormalCompletion<infer V>
? (unknown extends V ? Value | undefined : V)
: T extends Completion ? never
: T;
/** @see https://tc39.es/ecma262/#sec-returnifabrupt */
export declare function ReturnIfAbrupt<T>(completion: T):
(UnwrapNormalCompletion<T>)
& (asserts completion is UnwrapNormalCompletion<T>);
/** @see https://tc39.es/ecma262/#sec-returnifabrupt-shorthands */
export { ReturnIfAbrupt as Q };
/**
* The type signature is the same, but `AssertNormalCompletion` causes an error to be thrown at runtime
* if `argument` is an AbruptCompletion, whereas `ReturnIfAbrupt` gets replaced with code that causes
* the caller to return the AbruptCompletion by engine262's build system:
*
* @see https://tc39.es/ecma262/#sec-returnifabrupt
* @see https://tc39.es/ecma262/#sec-returnifabrupt-shorthands
*/
declare function AssertNormalCompletion<T>(completion: T):
(UnwrapNormalCompletion<T>)
& (asserts completion is UnwrapNormalCompletion<T>);
export { AssertNormalCompletion as X };
Checklist
My suggestion meets these guidelines:
- This wouldn't be a breaking change in existing TypeScript/JavaScript code
- This wouldn't change the runtime behavior of existing JavaScript code
- This could be implemented without emitting different JS based on the types of the expressions
- This isn't a runtime feature (e.g. library functionality, non-ECMAScript syntax with JavaScript output, etc.)
- This feature would agree with the rest of TypeScript's Design Goals.
Guide de contribution
Ouvrir le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Piste de recherche
Aucun fichier d’implémentation ni test n’est nommé. Commencez par examiner la gestion existante par TypeScript des fonctions d’assertion ainsi que les exemples de matchers Jest et de completion records. C’est terminé lorsque les fonctions d’assertion avec des valeurs de retour génériques autres que void sont prises en charge, tout en préservant le raffinement de type démontré.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Évaluation
- Stack technique
- typescript
- Domaine
- compilers
- Type d'issue
- Fonctionnalité
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Activité
- Calme
- Clarté
- Plutôt claire
- Accessibilité débutants
- 30/100