TypeScript에서의 object는 실제 obejct의 의미하고는 조금 다르게 쓰입니다.
// create by object literal
const person1 = {name: 'Mark', age: 39};
// person1 is not "object" type.
// person1 is "{name: string, age: number}" type.
// create by Object.create
const person2 = Object.create({name: 'Mark', age: 39});

object literal type 이라고 부릅니다.
Object타입은
"primitive type 이 아닌 것"을 나타내고 싶을 때 사용하는 타입입니다.
// create by object literal
const person1 = {name: 'Mark', age: 39};
// person1 is not "object" type.
// person1 is "{name: string, age: number}" type.
// create by Object.create
const person2 = Object.create({name: 'Mark', age: 39});
JavaScript에서 객체를 생성할 수 있는 방법은 크게 3가지가 있습니다.
1. 리터럴 표기(literal notation)를 이용한 방법
2. 생성자 함수(constructor function)를 이용한 방법
3. Object.create() 메소드를 이용한 방법
let obj: object = {}; // 보통은 이런식으로 object를 만들지 않습니다.
obj = {name: 'Mark'}; // object
obj = [{name: 'Mark'}]; // Array // Array도 object의 일종이니까...
obj = 39; // Error
obj = 'Mark'; // Error
obj = true; // Error
obj = 100n; // Error // bigint 타입
obj = Symbol(); // Error
obj = null; // Error
obj = undefined; // Error
위처럼
primitive type를 넣을 수 없게 할 때object타입을 쓰는 것입니다.
declare function create(o: object | null): void;
create({ prop: 0 });
create(null);
create(42); // Error
create("string"); // Error
create(false); // Error
create(undefined); // Error
// Object.create
Object.create(0); // Error
배열안에 있는 요소들은 전부 같은 타입이여야 합니다.

let list: number[] = [1, 2, 3]; // 첫번째 방법
let list: Array<number> = [1, 2, 3]; // 두번째 방법
let list1: number[] = [1, 2, 3, "4"]; // Error
number[] 타입에 string타입 4를 넣으면 에러가 발생합니다.let list1: (number | string)[] = [1, 2, 3, "4"]; // Error 없음
number타입과 string을 둘 다 허용하려면 위처럼 union타입으로 작성하면 됩니다.위 예시 union 배열의 각 요소들은
전부number이거나string입니다.
첫번째 요소인 1도number이거나string이고, 두번째 요소도number이거나string이고, 네번째 요소도number이거나string입니다.
위처럼 배열에서 값을 꺼낼 때 어떤 타입이 나올지 예상할 수 없을 때도 있지만, 정확히 어떤 값이 나올지 예상할 수 있을 때도 있습니다.
[39, "Mark"];위처럼 앞은 항상 숫자이고, 뒤는 항상 문자로 정해진 구조도 있을 수 있습니다.
이런 경우에도: (number | string)[]으로 표현한다면, 첫번째 자리는 항상 숫자이고, 두번째 자리는 항상 문자라는 것을 우리는 알고 있음에도 불구하고, 실제와는 다르게 설계된 타입을 만날 수 있습니다.
이런 경우에 대한 처리를
TypeScript에서 해주고자Array와 별개의 타입인Tuple타입을 하나 더 만들었습니다.
아래처럼 JavaScript 에서는 어느정도 타입을 유추합니다.
하지만 명확하게 하기 위해 TypeScript에서는 타입을 지정해줍니다.
tuple은 JavaScript에서는 지원하지 않는 데이터 타입이지만, TypeScript에서는 배열 타입을 보다 특수한 형태로 사용할 수 있는tuple타입을 지원합니다. tuple에 명시적으로 지정된 형식에 따라 아이템 순서를 설정해야 되고, 추가되는 아이템 또한 tuple에 명시된 타입만 사용 가능합니다.
let x: [string, number];
x = ["hello", 39]; // 순서, 타입, 길이가 맞아야 합니다.
// x = [10, 'Mark']; // Error
순서, 타입, 길이가 모두 맞아야 합니다.


const person: [string, number] = ["Mark", 39];
const [first, second] = person; // 구조 분해 할당(비구조화 할당)
tuple 이라 first변수와 second변수에 정확한 Type이 부여됩니다.(first: string, second: number)Array 이였다면 first와 second 전부 똑같이 union타입이 부여됐을겁니다.(first: string | number, second: string | number)
Tuple타입은 길이도 정해지기 때문에 위처럼 길이가 2인 Tuple 타입을 구조 분해 할당 으로 세번째 변수를 추가하면 Error를 발생시킵니다.
Array는 항상 같은 타입일 수밖에 없는 item들의 모임이고,
Tuple은 길이, 타입, 순서가 정해져있는 자료형입니다.