2016-03-30 9 views
13

Nehmen wir an, es gibt eine Tippdatei für die Bibliothek X, die einige Schnittstellen enthält.Gibt es eine Möglichkeit, den Typ der TypeScript-Schnittstelleneigenschaft zu "extrahieren"?

interface I1 { 
    x: any; 
} 

interface I2 { 
    y: { 
     a: I1, 
     b: I1, 
     c: I1 
    } 
    z: any 
} 

Um mit dieser Bibliothek ich ein Objekt herumgehen müssen zu arbeiten, die als I2.y von genau der gleichen Art ist.

interface MyInterface { 
    a: I1, 
    b: I1, 
    c: I1 
} 

let myVar: MyInterface; 

aber dann bekomme ich die Last es zu halten mit der, von der Bibliothek auf dem neuesten Stand, zudem können sie sehr groß sein und in vielen Code-Duplizierung führen: Ich kann natürlich identische Schnittstelle in meinen Source-Dateien erstellen .

Gibt es also eine Möglichkeit, den Typ dieser spezifischen Eigenschaft der Schnittstelle zu "extrahieren"? Ähnliches wie let myVar: typeof I2.y (was nicht funktioniert und zu dem Fehler "Kann den Namen I2 nicht finden" führt). Danke im Voraus.


bearbeiten: Nach ein wenig in TS Spielplatz spielen bemerkte ich, dass Sie folgenden Code erreicht genau das, was ich will:

declare var x: I2; 
let y: typeof x.y; 

jedoch eine redundante Variable erfordert x deklariert werden. Ich suche nach einem Weg, dies ohne diese Erklärung zu erreichen.

+1

* was nicht funktioniert * - wie manifestiert sich das? Was ist die eigentliche Fehlermeldung, die Sie sehen? –

+0

@BartekBanachewicz aktualisiert –

Antwort

23

es war nicht po vor, aber zum Glück ist es jetzt, seit TypeScript version 2.1. Es wurde am 7. Dezember 2016 veröffentlicht und führt indizierte Zugriffstypen auch als Lookup-Typen.

Die Syntax sieht genau wie Elementzugriff aus, wird aber anstelle von Typen geschrieben. Also in Ihrem Fall:

interface I1 { 
    x: any; 
} 

interface I2 { 
    y: { 
     a: I1, 
     b: I1, 
     c: I1 
    } 
    z: any 
} 

let myVar: I2['y']; // indexed access type 

Jetzt hat myVar Art von I2.y.

Überprüfen Sie es in TypeScript Playground.

+0

In dem Fall, wenn 'y' ein Array ist, gibt es eine Möglichkeit, den Typ der Elemente zu extrahieren?z.B. I2 {y: {..} []} –

+0

@JohnB ja, Sie können es auf genau die gleiche Weise tun, weil Array-Indizes genau wie Objekteigenschaften sind. Schau es dir hier an: http://www.typescriptlang.org/play/#src=let%20x%3A%20Array%3Cnumber%3E%20%3D%20%5B%5D%3B%0D%0Alet%20y% 3A% 20type% 20x% 5B0% 5D% 3B% 20% 2F% 2Fy% 20is% 20von% 20type% 20% 22nummer% 22% 0D% 0A% 0D% 0A% 2F% 2Formen% 20auch% 20mit% 20Tuples% 0D% 0Alet% 20x1% 3A% 20% 5BString% 2C% 20Boolean% 2C% 20Anzahl% 5D% 3B% 0D% 0Alt% 20y1% 3A% 20Typ von% 20x1% 5B1% 5D% 3B% 20% 2F% 2Fy1% 20IS% 20% 20Typ% 20Boolean –

+0

@JohnB ja, Sie können es auf die gleiche Weise, dh zugreifen. 'I2 ['y'] [0]' Siehe: http://www.typescriptlang.org/play/index.html#src=interface%20I1%20%7B%0D%0A%20%20%20%20x % 3A% 20%% 3B% 0D% 0A% 7D% 0D% 0A% 0D% 0Ainterface% 20I2% 20% 7B% 0D% 0A% 20% 20% 20% 20y% 3A% 20Array% 3CI1% 3E% 0D% 0A % 20% 20% 20% 20z% 3A% 20any% 0D% 0A% 7D% 0D% 0A% 0D% 0Alt% 20myVar% 3A% 20I2% 5B'y '% 5D% 5B0% 5D% 3B% 0D% 0A% 0D% 0Aconsole.log (myVar.x)% 3B% 0D% 0A –

0

Eine Schnittstelle ist wie die Definition eines Objekts. Dann ist y eine Eigenschaft Ihres I2-Objekts, das von einem bestimmten Typ ist, in diesem Fall "anonymous".

Sie eine andere Schnittstelle y zu definieren, verwenden könnte und es dann wie diese als y-Typ verwenden

interface ytype { 
    a: I1; 
    b: I1; 
    c: I1; 
} 

interface I2 { 
    y: ytype; 
    z: any; 
} 

Sie Ihre Schnittstelle in einer Datei speichern, und Extrakt verwenden, so dass Sie es in anderen Dateien Ihrer importieren Projekte

export interface ytype { 
    a: I1; 
    b: I1; 
    c: I1; 
} 



export interface I2 { 
     y: ytype; 
     z: any; 
    } 

Sie können es auf diese Weise importieren:

import {I1, I2, ytype} from 'your_file' 
+0

Alles ist in Ordnung, aber wie ich bereits erwähnt - die Schnittstellen I1 und I2 stammen aus einer externen Bibliothek und sind in d.ts Datei für diese Bibliothek definiert. Daher wäre diese Y-Typ-Schnittstelle eine Code-Duplizierung und müsste ständig aktualisiert werden. –