microsoft - typescript best practices typings
¿Hay alguna forma de "extraer" el tipo de propiedad de la interfaz de TypeScript? (2)
Antes no era posible, pero afortunadamente lo es ahora, desde la versión 2.1 de TypeScript . Se lanzó el 7 de diciembre de 2016 e introduce tipos de acceso indexados, también llamados tipos de búsqueda .
La sintaxis se ve exactamente como acceso a elementos pero escrita en lugar de tipos. Así que en tu caso:
interface I1 {
x: any;
}
interface I2 {
y: {
a: I1,
b: I1,
c: I1
}
z: any
}
let myVar: I2[''y'']; // indexed access type
Ahora myVar
tiene tipo de I2.y
Compruébalo en TypeScript Playground .
Supongamos que hay un archivo de escritura para la biblioteca X que incluye algunas interfaces.
interface I1 {
x: any;
}
interface I2 {
y: {
a: I1,
b: I1,
c: I1
}
z: any
}
Para trabajar con esta biblioteca, necesito pasar un objeto que sea exactamente del mismo tipo que I2.y
Por supuesto, puedo crear una interfaz idéntica en mis archivos de origen:
interface MyInterface {
a: I1,
b: I1,
c: I1
}
let myVar: MyInterface;
pero luego tengo la carga de mantenerlo actualizado con el de la biblioteca, además, puede ser muy grande y resultar en una gran cantidad de duplicación de código.
Por lo tanto, ¿hay alguna forma de "extraer" el tipo de esta propiedad específica de la interfaz? Algo similar a let myVar: typeof I2.y
(que no funciona y da como resultado el error "No se puede encontrar el nombre I2"). Gracias por adelantado.
Edición : después de jugar un poco en TS Playground, me di cuenta de que el siguiente código logra exactamente lo que quiero:
declare var x: I2;
let y: typeof x.y;
Sin embargo, requiere una variable redundante x
para ser declarada. Estoy buscando una manera de lograr esto sin esa declaración.
Una interfaz es como la definición de un objeto. Entonces y es una propiedad de su objeto I2, que es de un tipo determinado, en ese caso "anónimo".
Podría usar otra interfaz para definir y y luego usarla como su tipo y así.
interface ytype {
a: I1;
b: I1;
c: I1;
}
interface I2 {
y: ytype;
z: any;
}
Puede poner su interfaz en un archivo y usar extracto para poder importarlo en otros archivos de sus proyectos
export interface ytype {
a: I1;
b: I1;
c: I1;
}
export interface I2 {
y: ytype;
z: any;
}
Puedes importarlo de esa manera:
import {I1, I2, ytype} from ''your_file''