Maison  >  Questions et réponses  >  le corps du texte

Pourquoi TS se plaint-il lorsqu'il utilise @type au lieu de @param et @return lors de l'écriture d'une fonction générique ?

Pourquoi TS se plaint de ça :

/**
 * @template X
 * @type {function(X): X}
 */
const identity1 = (x) => x;

/**
 * @template X
 * @type {function(X): X}
 */
const identity2 = (x) => identity1(x);

Message d'erreur TypeScript :

Type 'X' is not assignable to type 'X'. Two different types with this name exist, but they are unrelated.
  'X' could be instantiated with an arbitrary type which could be unrelated to 'X'.ts(2719)
graph.mjs(4, 14): This type parameter might need an `extends X` constraint.
const identity1: (arg0: X) => X
@template X
@type — {function(X): X}

Cependant, lors de l'utilisation de @param@return 更改 @type, cela fonctionne bien :

/**
 * @template X
 * @param {X} x
 * @returns {X}
 */
const identity1 = (x) => x;

/**
 * @template X
 * @type {function(X): X}
 */
const identity2 = (x) => identity1(x);

Je ne comprends pas pourquoi. La documentation ne fait aucune mention de la manière dont ces deux signatures interagissent différemment avec les types génériques.

P粉464082061P粉464082061180 Il y a quelques jours333

répondre à tous(1)je répondrai

  • P粉448130258

    P粉4481302582024-04-04 10:26:28

    Utilisez @type 标记引用的类型范围仅限于大括号内。也就是说, @type {function(X): X} 不引用泛型类型,因为我们在范围之外引用了 X。至少这是我的解释。无论如何,不​​支持从 @type pour extraire le type fourni.

    Cependant, vous pouvez utiliser @typedef pour remplacer la fonctionnalité :

    /**  
    * @template X  
    * @typedef {X extends number ? [1, 2, 3][X] : never} Successor  
    */ 
    
    /**  
    * @template X  
    * @typedef {X} Identity  
    */ 
    
    /**
    * @template X  
    * @typedef {Identity>} Identity2  
    */
    
    /** @type {Successor>} */ 
    const x = 2;  
    
    

    répondre
    0
  • Annulerrépondre