JS에서 객체 프로퍼티 접근법은 2가지가 있다.
const obj = { a: "A" };
// 마침표 접근법
obj.a;
// 대괄호 접근법
obj["a"];
객체에 값을 수정하거나 추가할 때는 아래의 방법으로 하면 된다.
const obj = { a: "A" };
// 수정(마침표 접근법)
obj.a = "a";
// 수정(대괄호 접근법)
obj["a"] = "a";
// 추가(마침표 접근법)
obj.b = "B";
// 추가(대괄호 접근법)
obj["b"] = "B";
TS에서는 JS와 같은 방법으로 추가하면 에러가 발생한다. (수정은 괜찮다.)
const obj = { a: "A" };
// 추가(마침표 접근법)
obj.b = "B";
// 추가(대괄호 접근법)
obj["b"] = "B";
Property 'b' does not exist on type '{ a: string; }'.
객체 obj의 타입에는 'b'라는 속성이 없다는 것이다.
실제로 객체 obj에 마우스를 올리며 위와 같이 타입이 자동으로 추론되어 나온다. (타입을 입력해주어도 똑같다)
생각해보면 객체 obj의 타입으로 a의 키를 가진 string 값만 들어올 수 있다.
애초에 다른 키 값이 들어 갈 수 없다.
이럴 때 타입에 index signature를 사용하면 가능하다.
const obj: { [key: string]: string } = { a: "A" };
// 추가(마침표 접근법)
obj.b = "B";
// 추가(대괄호 접근법)
obj["b"] = "B";
객체의 키를 [key: string]으로 객체의 키 값은 string값
객체의 값은 string 값으로 설정하는 것이다.
이렇게 키 값에 어떤 string 값이 입력가능해져서 할당되어 있지 않는 키로도 접근이 가능하게 된다.
index signiture를 사용하면 굳이 접근할 때만 사용하는 것이 아니라 객체를 생성할 때도 유연하게 생성할 수 있다.
const obj: {a : number, b : number, c : number, d : number} = { a : 1, b : 2, c : 3, d : 4 };
const obj: { [key: string] : number } = { a : 1, b : 2, c : 3, d : 4 };
위의 2개 모두 가능하다.
그래도 타입을 명확히 해줘야 좋다고 알고 있는데 정확하지 않다.
'TypeScript' 카테고리의 다른 글
[TS] TypeScript 구조적 타이핑, 덕 타이핑 (0) | 2022.12.30 |
---|---|
keyof 연산자 (0) | 2021.12.23 |
declare 이란? (0) | 2021.12.15 |
tsc -w (0) | 2021.11.23 |
TypeScript 문법 (0) | 2021.11.06 |