IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

TypeScript Discussion :

Les génériques, cela n'est pas automatique !


Sujet :

TypeScript

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 41
    Points : 33
    Points
    33
    Par défaut Les génériques, cela n'est pas automatique !
    Bonjour,

    Je rencontre des problèmes pour utiliser correctement les génériquezs de TypeScript sur des types de base tels que les Maps ES2015 ou des types personnalisés comme des classes. Je précise que j'utilise TYpeScript dansune application Vite (vanilla TS)

    Si j'écris:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    const m: Map <number, number> = new Map()
     
    // le compilateur laisse passer cela:
    m.set('abcd', 'efgh')
    Peut être y'a til une option de tsconfig.json mal positionnée ?

    Le pire vient quand je tente d'encapsuler une liste d'items portant des données et ayant un UID (string 5 caractères alphanumériques minuscule + '_' = 37 valeurs possibles) avec un Map de lookup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    import { MWCRand } from './MWCRand.ts'
    import { TDRUID, key2values, values2key  } from 'TDRUID.ts'
    import { TDataBlock } from './TDataBlock.ts'
     
    export class DataBlocksRepo <T> {
        // PNRG
        protected _generator = new MWCRand')
     
        // liste pouir le stockage d'items et les filtrages/map/reduce
        protected _entries: TBataBlock<T>[] = []
     
        // table d'accès en O(1) sur les items
        protected _lokkups: Map <TDRUID, TBataBlock<T>> = new Map()
     
        constructor () { 
            this._generator = new MWCRand({
                multiplier: 34567,
                modulus: 37,
                length: 5
            })
     
            this._generator.init([3, 4, 5, 6, 7])
     
    // ou...
    //        this._generator.init(key2values('_uid_'))
        }
     
        add (datum: T): TDRUID {
            let uid: TDRUID
            let block: TDataBlock <T>
     
            do {
                // tant que le générateur génçre une collision 
                // on calcule un autre UID
     
                // MWC produit 93% de valeurs distinctes quand on l'applique  1M fois
                // nombre de clés possibles = Math.pow(37, 5) ~ 69M
     
                uid = values2key(this._generator.step())
            } while (this._lookups.has(uid))
     
            block = {
                uid, datum, marked: false
            }
     
            this._entries.push(block)
            this._lookups.set(uid, block)
     
        console.log('add:', datum, 'typeof', typeof datum)
     
            return uid
        }
     
        get (uid: TDRUID): T {
            const block = this._lookups.get(uid)
     
            console.log({ block })
     
            return block.datum
        }    
    }
    Et quand on fait invoque tout cela cela ne fonctionne pas bien non plus:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    type TData = {
        [key: string]: string
    }
     
    const dbr: DataBlocksRepo <TData> = new TDataBlocksRepo()
     
    // cela fonctionne
    const uid0 = dbr.add({ 'abcd', 'efgh' })
     
    // cela fonctionne aussi, MAIS cela ne drait pas le faire
    const uid1 = dbr.add({ 'xyzw', null })
    const uid2 = dbr.add(null)
    Comment cela se fait-il que les génériques ne semblent pas faire leur travail correctement, en bloquant le projet à laz phase de compilation de TypeSCript ?

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2018
    Messages
    41
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juin 2018
    Messages : 41
    Points : 33
    Points
    33
    Par défaut la réponse était dans la question !
    en regardant de plus près le package.json du projet, dans la section "scripts":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      "scripts": {
        "dev": "vite",
        "build": "tsc && vite build",
        "serve": "vite preview"
      },
    c'est très clair: la vérification de types n'est effectuée qu'au build. Donc "npm run build" est la bonne réponse...

    que renvoie "npm run dev" quand on lui passe un ensemble de sources TS ? probablement du JS compilé en dégageant les déclarations de type... puisque (aux erreurs logiques près) cela marche dans la console du navigateur !!!

    ET la tada !!! mes génériques sont bien vérifiés, et il y a pas mal d'erreurs à fixer.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Document imprimé - plus général que cela c'est pas possible
    Par pjmorce dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 10/01/2009, 23h29
  2. [C#][Débutant] Datagrid, les colonnes ne se resizent pas automatiquement
    Par Cazaux-Moutou-Philippe dans le forum Windows Forms
    Réponses: 1
    Dernier message: 02/05/2006, 08h08
  3. Réponses: 2
    Dernier message: 19/10/2005, 19h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo