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 ?
P粉464082061
P粉464082061 2024-04-03 12:10:23
0
1
321

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粉464082061
P粉464082061

répondre à tous(1)
P粉448130258

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;  

Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!