После деструктурирования присваивания с помощью «let» я не могу отказаться от их переменной?

Практикуя NestJS..

DTO используется в контроллере, и я объявил для них 3 переменные, деструктурировав присваивание. В это время я использовал ключевое слово «let» при объявлении теста.

export class SignUpDto {
  name: string;
  email: string;
  readonly password: string;
}
  @Post()
  async signUp(@Body() signUpDto: SignUpDto): Promise<void> {
    let { name, email, password } = signUpDto;
    console.info(1, name);
    if (!name || !email || !password) {
      throw new BadRequestException();
    }
    name = 'new name';
    console.info(2, name);
    console.info(signUpDto.name);
    await this.usersService.signUp(signUpDto);
  }

Сразу после объявления «имя» имеет значение, которое имеет тело REQ. («имя пользователя»). поэтому я изменил его значение на «новое имя»

а затем переменная «имя» печатает «новое имя» в консоли, когда я регистрирую только переменную «имя». Но когда я регистрирую «signUpDto.name», он все равно печатает «имя пользователя».

// console.info(1, name);
1 username

// console.info(2, name);
2 new name

// console.info(signUpDto.name);
username

// the result returned from usersService
UsersService { name: 'username', email: '[email protected]', password: 'PassWord' }

Я читал официальные документы, но не смог найти правильную причину.

Одна из моих идей заключается в том, что они хранились в разных местах памяти, поэтому они печатают разные значения.

Не могли бы вы сообщить мне, что это значит? Я не знаю, почему значение имени не изменилось..

let name = signUpDto.name создает отдельную переменную (значение скопировано из оригинала), поэтому все, что вы сделаете впоследствии с name, не повлияет на signUpDto.
qrsngky 02.04.2023 06:40

Typescript — это надмножество JavaScript, поэтому здесь применяются правила присваивания JavaScript. Если вы хотите спуститься в кроличью нору, оператор присваивания определен здесь , а деструктурирующее присваивание здесь

apokryfos 02.04.2023 10:24
Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
2
55
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Когда вы деструктурируете объект с помощью let { name } = body, вы создаете новую переменную с именем name. Доступ к этому значению осуществляется по значению, а не по ссылке, поэтому, когда вы его изменяете, оно также не изменяет исходное значение объекта.

@Ramsey, если это отвечает на ваш вопрос, отметьте его как ответ (зеленая галочка рядом с голосованием)

Dimava 02.04.2023 11:16

Другие вопросы по теме