[TypeScript] 템플릿 리터럴과 계산된 프로퍼티로 프로퍼티명 동적 문자열 넣기(변수값을 정해진 프로퍼티명으로 사용하기) - TypeOrm
TypeScript를 사용하여 NestJS + TypeORM 개발을 하던 도중, 문자열을 프로퍼티명으로 적어야 하는 상황이 생겼습니다.
상황상 컬럼을 Enum으로 둘 수 없었고, Enum의 요소들 각각을 컬럼으로 집어넣었습니다.
예를 들어서 element1, element2, element3가 하나의 컬럼에 있는 것이 아니라 각각의 element1, element2, element3로 컬럼이 독립적으로 존재하는 것입니다.
이 상황에 프론트에서 Enum에 속하는 element1, element2, element3을 someElement라는 속성의 값으로 전달을 하게 되면, 이를 업데이트를 해야 하는 상황이 왔었는데, 기존에는 프로퍼티에 element1, element2, element3를 이름으로 적어야 하지만, someElement라는 속성의 값이 요청으로 들어오게 됐습니다.
즉, 변수에 있는 값을 특정 메서드에 들어가는 인자의 프로퍼티명으로 사용해야 하는 상황이었습니다.
예를 들자면 아래와 같습니다.
@Entity('example_table')
class ExampleTable {
@PrimaryGeneratedColumn()
id: number;
@Column({ type: 'int', default: 0, nullable: true })
element1: number;
@Column({ type: 'int', default: 0, nullable: true })
element2: number;
@Column({ type: 'int', default: 0, nullable: true })
element3: number;
}
const Element = {
element1: 'element1',
element2: 'element2',
element3: 'element3',
} as const;
type Element = typeof Element[keyof typeof Element];
// example-table.repository.ts
...
updateExampleTableWithElement(id: number, element: Element) {
return this.createQueryBuilder('exampleTable')
.update()
.set({ element }) // 여기서도 값을 하나 증가시키는 Query를 사용해서 문자열을 써야 했습니다. 지금은 그냥 업데이트하는 예시입니다.
.where('exampleTable.id = :id', { id })
.returning(['id'])
.execute();
}
위와 같은 상황일 때, element는 ExampleTable 엔티티에 존재하지 않는 속성이므로, 타입 에러가 발생하게 됩니다.
이를 해결하기 위해서는 오직 element1, element2, element3를 프로퍼티명으로 기재해야 합니다.
이때, 문자열을 프로퍼티명으로도 사용할 수 있기에, 템플릿 리터럴과 플레이스 홀더를 사용해 프로퍼티명으로 등록합니다.
그런데, 바로 백틱을 사용해서 플레이스 홀더로 변수를 프로퍼티명으로 넣으려면 `property assignment required`라는 오류가 발생합니다.
.set({
`${element}`: `${element} + 1`,
~~~~~~~~~ Parsing Error: property assignment expected
})
이를 해결하기 위해서 아래와 같이 기재하면 됩니다.
.set({
[`${element}`]: `${element} + 1`,
})
이로서, 내가 원하는 컬럼을 바디의 속성으로 받아 변수값을 프로퍼티명으로 사용해야 하는 상황일 때 적절하게 대처할 수 있게 됐습니다!