#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:
Я не думаю, что это возможно сделать. Типы должны быть явно определены для каждого конкретного случая.