2017-09-20 3 views
-1

J'ai une question, comment obtenir le type d'élément de tableau via les types mappés Par exemple ici lorsque j'utilise la méthode array je peux déduire le type d'élément de tableau, mais comment fait en arrayStr méthode? Et pourquoi dans cet exemple aStrId a le type 'jamais'?TypeScript: Comment déduire type d'élément de tableau en utilisant des types mappés

Sandbox

class One<T> { 

    constructor(
     data: T 
    ) { } 

    array<R>(getter: ((obj: T) => R[])): Two<R> { 
     return null; 
    } 

    arrayStr<K extends keyof T, R>(name: K, idField: keyof R): Two<R> { 
     return null; 
    } 

} 

class Two<T> { 

    getItem(): T { 
     return null; 
    } 

    getAsArray(): T[] { 
     return []; 
    } 

} 

const data = { 
    a: [{ q: 1 }, { q: 2 }] 
}; 

const one = new One(data); 
const a = one.array(p => p.a); 
const aValue = a.getItem().q; 

const oneStr = new One(data); 
const aStre = oneStr.arrayStr('a'); 
const aStrValue = aStre.getItem().q; 

const oneStrId = new One(data); 
const aStrId = oneStrId.arrayStr('a', 'q'); 
const aStrValueId = aStre.getItem().q; 
+0

J'ai de la difficulté à comprendre la question. Pouvez-vous poster le code directement avec des endroits spécifiques que vous rencontrez des problèmes? Qu'est-ce que la méthode 'arrayStr()' est censée faire? La signature est étrange (il ne semble pas y avoir de moyen de savoir ce que 'R' est censé être) et l'implémentation (' return null') ne me donne aucun indice. – jcalz

Répondre

0

J'ai obtenu une réponse ici à tapuscrit Gitter link. Cela fonctionnera:

arrayStr<K extends keyof T, R, E>(this: One<{[k in K]: R[] | E}>, name: K): Two<R> {