Skip to content

Type narrowing: support type guard functions #42

Description

@5pilow

Description

Actuellement, le type narrowing de LeekScript fonctionne pour les vérifications inline (x != null, x instanceof Array, etc.), mais ne supporte pas les type guards : des fonctions dont le résultat booléen informe le compilateur sur le type d'un paramètre.

Exemple de syntaxe proposée

function isString(any x): x is string {
    return typeOf(x) == TYPE_STRING
}

any value = "hello"
if (isString(value)) {
    // Ici, value est narrowed à 'string'
    debug(length(value)) // Pas d'alerte !
}

Pourquoi c'est utile

  • Permet d'encapsuler des vérifications de type complexes dans des fonctions réutilisables
  • Évite de dupliquer la logique de vérification à chaque if
  • C'est un pattern très utilisé dans TypeScript (x is T) et Kotlin (contract { returns(true) implies (x is T) })

Implémentation envisagée

  1. Ajouter une syntaxe de retour de type guard sur les fonctions (ex: function f(any x): x is Type { ... })
  2. Stocker l'information de type guard dans FunctionBlock / FunctionType
  3. Dans NarrowingInfo.extractInto(), quand la condition est un appel de fonction avec un type guard, extraire le narrowing correspondant sur l'argument
  4. Appliquer le narrowing dans les branches true/false comme pour les autres cas

Lien

Fait partie de l'amélioration du type narrowing — voir aussi le fichier d'exemples examples/narrowing.leek.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions