Практикуя 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' }
Я читал официальные документы, но не смог найти правильную причину.
Одна из моих идей заключается в том, что они хранились в разных местах памяти, поэтому они печатают разные значения.
Не могли бы вы сообщить мне, что это значит? Я не знаю, почему значение имени не изменилось..
Typescript — это надмножество JavaScript, поэтому здесь применяются правила присваивания JavaScript. Если вы хотите спуститься в кроличью нору, оператор присваивания определен здесь , а деструктурирующее присваивание здесь
Когда вы деструктурируете объект с помощью let { name } = body
, вы создаете новую переменную с именем name
. Доступ к этому значению осуществляется по значению, а не по ссылке, поэтому, когда вы его изменяете, оно также не изменяет исходное значение объекта.
@Ramsey, если это отвечает на ваш вопрос, отметьте его как ответ (зеленая галочка рядом с голосованием)
let name = signUpDto.name
создает отдельную переменную (значение скопировано из оригинала), поэтому все, что вы сделаете впоследствии сname
, не повлияет наsignUpDto
.