Typescript принудительное разрушение объектов

#javascript #node.js #typescript

#javascript #node.js #машинописный текст

Вопрос:

Я пытаюсь написать класс, который использует свой универсальный тип в качестве объекта, подлежащего деструктуризации, чтобы принудительно использовать только те поля, которые будут использоваться.

Можно ли использовать typescript, чтобы указать, что объект должен быть деструктурирован, и работать с его полями?

 class A<T> {
  doSomething ( { destructured object }: T) {
    // work with destructured T...
  }
}
 

Например, идентификатор объекта с таким интерфейсом для вставки в базу данных:

 interface AnInterface { a: number; b: string; }
 

Поэтому я создаю этот универсальный класс

 Class CRUDLService<T> {
  create( { destructured object }: T ) {
    // Insert object with the fields of T only, not any other
  }
}
 

Таким образом, я могу создать универсальный сервис, например:

 const anInterfaceService = new CRUDLService<AnInterface>();
 

Таким образом, я мог бы попытаться гарантировать, что всякий раз, когда вызывается anInterfaceService.create, используются только правильные поля.

То, как я делаю это прямо сейчас, не использует преимущества typescript, вместо этого, когда вы создаете эти универсальные классы, вам нужно указать массив строк, которые представляют поля, извлекаемые из объекта для операции. ie:

 const createFields = ['a', 'b']; 
 

Комментарии:

1. Я не улавливаю, в чем заключается вопрос. Не могли бы вы привести два примера: один из того, что должно работать, и один из того, что не должно работать?

2. У деструктурированного объекта не может быть типа <T> , потому что, как только вы его деструктурируете, у вас есть отдельные переменные

3. Как вы можете заставить объект универсального типа иметь определенные свойства? Вы можете попробовать создать такой интерфейс, как: interface IMinimumProperties { property1: string, [key: string]: any } . Таким образом, вы можете применить некоторые свойства

4. » Можно ли использовать typescript, чтобы указать, что объект должен быть деструктурирован», — это не тип . Это применение произвольного правила к кодовой базе, которое не входит в компетенцию TS. Деструктурирование — это просто синтаксический сахар — вместо выполнения obj.a и obj.b вы можете сократить это до a и b , но это просто альтернатива, а не то, на что должен полагаться код.

Ответ №1:

Вы, конечно, можете это сделать, но то, что T здесь, T — это просто тип без какого-либо свойства, так что вы будете разрушать здесь. Вы можете определить T как вариант некоторого типа и использовать разрушение объекта,

Вот простой пример,

 interface SomeProps {
  name: string;
}

class A<T extends SomeProps> {
  doSomething({ name }: T) {
    console.log(name);
  }
}
 

Кстати, это сработает, если вы попытаетесь уничтожить свой T вопрос. Это просто пустой объект, я не вижу здесь никакого варианта использования.

Итак, это также вполне допустимый синтаксис,

 class A<T> {
  doSomething({}: T) {

  }
}
 

Ответ №2:

Я не думаю, что это возможно сделать. Типы должны быть явно определены для каждого конкретного случая.