Estoy tratando de averiguar si hay una manera de usar la desestructuración de objetos de mecanografiado/javascript para apuntar solo a un subconjunto de las propiedades de los objetos mientras se mantienen las propiedades restantes del objeto en su propia variable, "capturando todas las demás propiedades/claves".
Mi caso de uso está relacionado con el uso de la herencia para extender una clase al intentar dejar la API similar. En el siguiente ejemplo, solo quiero usar la destrucción de objetos para las propiedades onlyForB y alsoOnlyForB mientras paso todas las propiedades restantes a la variable de config .
class A { constructor(config) { this.name = config.name; // ... } } class B extends A { constructor({ onlyForB, alsoOnlyForB, ..config }) { // using ...config doesn't work this.onlyForB = onlyForB; this.alsoOnlyForB = alsoOnlyForB; super(config); } } const b = new B({ onlyForB: "B", alsoOnlyForB: "B2", name: "Satoshi", age: 100}); /** Trying to achieve the following in class B's constructor onlyForB -> "B" alsoOnlyForB -> "B2" config -> { name: "Satoshi", age: 100 } */ Cuando pruebo esto con { onlyForB, alsoOnlyForB, ..config } que es similar a crear objetos con la sintaxis extendida, obtengo errores. En el caso de uso real, estoy extendiendo una clase de código abierto que tiene principalmente propiedades de "configuración" y usando mecanografiado.
¿Hay alguna manera de lograr esto sin eliminar manualmente todas las propiedades del objeto específicas de la clase B ?
Nota al margen: para aquellos familiarizados con Python, estoy tratando de lograr algo similar a lo que hace **kwargs , es decir. def __init__(self, onlyForB, alsoOnlyForB, **kwargs) .
Hay muchas formas posibles de hacer algo como esto; aquí hay un ejemplo:
type ConfigForB = { onlyForB: string, alsoOnlyForB: string, age: number, name: string } type ConfigForA = Omit<ConfigForB, 'onlyForB' | 'alsoOnlyForB'> class A { private name: string constructor(config: ConfigForA) { this.name = config.name; // ... } } class B extends A { private onlyForB: string private alsoOnlyForB: string constructor({ onlyForB, alsoOnlyForB, ...config }: ConfigForB) { super(config); this.onlyForB = onlyForB; this.alsoOnlyForB = alsoOnlyForB; } } const b = new B({ onlyForB: "B", alsoOnlyForB: "B2", name: "Satoshi", age: 100}); ConfigForB un tipo ConfigForB que tiene las cuatro propiedades enumeradas en su ejemplo y usé ese tipo en el constructor para B . Luego usé el tipo de utilidad Omit Omit<Type, Keys> para construir un nuevo tipo ConfigForA , que es exactamente igual que ConfigForB , excepto que no tiene las claves onlyForB y alsoOnlyForB .
Si tuviera que definir esto explícitamente, se vería así:
type ConfigForA = { age: number, name: string } Esto también funcionaría, por cierto: usar Omit es simplemente bueno ya que no tienes que repetirlo.
Puede probar esto en TS Playground aquí .