






number 타입이다.is 메소드를 활용해야한다.null 값을 변수의 임시값으로 활용하고 싶다면?
- tsconfig.json 파일의
strictNullChecks옵션을 false로 설정하면 된다.strictNullChecks옵션은 타입스크립트에서 null 값을 null 타입 이외의 타입의 변수에 할당하는 것을 금지할지 허락할지 여부를 결정하는 옵션이다.- 기본값은 true이며 이 옵션이 true로 켜져있을 경우 엄격하게 null 값을 검사해 null 타입이 아닌 변수에는 null 값을 할당할 수 없도록 제한한다. 그런데 false로 설정해 이 옵션을 끌 경우 어떤 타입의 변수든 null 값을 자유롭게 할당할 수 있다.
- 또 이 옵션은
strict옵션의 하위 옵션이다. 따라서strict옵션이 true이면 자동으로 true로 설정되며, 반대로strict옵션이 false이면 자동으로 false로 설정된다.

배열요소타입[] 형식으로 배열 타입을 정의한다.Array<배열요소타입> 형태로도 배열의 타입을 정의할 수 있다. 이렇게 꺽쇠와 함께 타입을 작성하는 문법을 타입스크립트에서는 ‘제네릭’ 이라고 부릅니다. 위 두가지 방법은 모양만 다를뿐 기능은 동일하다.
(…)[] 형식에서 소괄호는 앞서 배열 요소의 타입을 의미하고, 소괄호 내부의 number | string은 배열 요소의 타입이 stirng이거나 number 일 것을 의미한다.




push나 pop을 이용해 고정된 길이를 무시하고 요소를 추가하거나 삭제할 수 있다.
튜플 타입과 다차원 배열을 헷갈리지 말자!
1. 다차원 배열
ex) const matrix: number[][] = [[1, 2], [3, 4]];
다차원 배열에는 위 코드처럼 [ ] 를 두번 사용합니다. 즉, number 배열로 이루어진 배열이라는 뜻이죠.
그래서 내부의 값에 접근할 때 인덱스를 두번 사용하죠?
matrix[0][1]; // 2
2. 튜플
- 튜플은 배열 "하나"에 안에 들어가는 요소의 타입과 갯수를 지정한거에요.
const score: [string, number] = ["blue team", 19];
- 그럼 당연히 배열 하나니까 인덱스를 하나만 사용해서 접근할 겁니다.
score[1] // 19
- 인덱스를 두번 써서 접근하는 건 튜플 타입 선언 뒤에 대괄호를 하나 더 붙여서 배열로 만들면 됩니다.
const scores: [string, number][] = [["blue team", 19], ["red team", 10]];
이렇게 선언하면 아래처럼 인덱스 두개를 써서 접근하게 됩니다.
score[1][0] // red team
- 튜플은 선언을 할 때 값의 개수도 함께 지정합니다. 그래서 push 메소드로 튜플의 길이를 늘리려고 하면 오류가 납니다.


여기서 한가지 알 수 있는 사실은 타입스크립트는 기존의 정적 타입 시스템을 따르는 언어인 C나 Java(명목적 타입 시스템)와는 달리 객체의 타입을 정의할 때 프로퍼티를 기준으로 객체의 구조를 정의하듯이 타입을 정의한다는 점이다.
타입스크립트의 이런 특징을구조적 타입 시스템이라고 부른다. 객체의 구조를 결정하는 것은 프로퍼티입니다. 따라서 타입스크립트는 이 객체에 어떤 프로퍼티들이 있어야 하는지 정의하는 방식으로 객체의 타입을 정의한다.

정리하자면,
객체 타입은 { } 안에 프로퍼티 이름을 적고, 콜론 뒤에 프로퍼티 값의 타입을 적습니다. 객체 타입에서 각 프로퍼티는 쉼표가 아닌 세미콜론으로 구분한다.
readonly 키워드를 붙이면 된다.



type 타입_이름 = 타입 형태로 타입을 정의한다.

[key : string] : string 은 인덱스 시그니쳐 문법으로 이 객체 타입에는 key가 string 타입이고 value가 string 타입인 모든 프로퍼티를 포함된다 라는 의미이다. 
any 이다. (타입 검사를 받지 않는 특수한 타입)



"strict": true로 되어있으면 noImplicitAny가 true 로 되어있다.

이번에는 함수 자체에 타입을 정해보자
이거는 화살표 문법이랑 비슷하다.


정리한번하자
- 배열과 튜플
배열 타입을 만들려면 타입을 적고 [ ]를 붙입니다.
만약에 배열의 배열을 만들고 싶다면 배열 타입 뒤에 [ ]를 붙이면 됩니다.
튜플은 개수랑 순서가 정해져 있는 배열입니다.
[ ] 안에 순서대로 타입을 쉼표로 구분해서 씁니다.
// 배열
const cart: string[] = [];
cart.push('c001');
cart.push('c002');
// 배열의 배열
const carts: string[][] = [
['c001', 'c002'],
['c003'],
];
// 튜플
let mySize: [number, number, string] = [175, 30, 'L'];
- 객체 타입
{ } 안에다가 프로퍼티 이름을 쓰고 콜론 다음에 타입을 씁니다. 각 프로퍼티는 세미콜론으로 구분합니다.
필수가 아닌 프로퍼티는 프로퍼티 이름 뒤에 물음표를 붙입니다.
let product: {
id: string;
name: string;
price: number;
membersOnly?: boolean; // 필수가 아닌 프로퍼티
sizes: string[];
} = {
id: 'c001',
name: '코드잇 블랙 후디',
price: 129000,
sizes: ['M', 'L', 'XL'],
};
if (product.membersOnly) {
console.log('회원 전용 상품');
} else {
console.log('일반 상품');
}
- 프로퍼티의 개수를 정하지 않고, 프로퍼티 값의 타입을 정하고 싶다면 아래와 같은 문법을 활용해 보세요.
let stock: { [id: string]: number } = {
c001: 3,
c002: 0,
c003: 2,
};
- any 타입
- 자바스크립트를 사용할 때와 마찬가지로 자유롭게 쓸 수 있는 타입입니다.
- 되도록이면 any 타입으로 지정하지 않는 것을 권장합니다.
- 어쩔 수 없이 any 타입을 사용하는 경우 as 키워드를 써서 타입을 지정하거나, 콜론으로 타입을 지정할 수 있습니다.
const parsedProduct = JSON.parse('{ "name": "코드잇 토트백", "price": 12000 }') as { name: string; price: number };
const parsedProduct: { name: string; price: number } = JSON.parse('{ "name": "코드잇 토트백", "price": 12000 }');
- 함수 타입
리턴 타입을 지정하는 경우에는 다음 코드처럼 작성하면 됩니다.
function addToCart( id: string, quanity: number): boolean {
if (어떤 조건) {
return false;
}
return true;
}
- 리턴 타입을 미리 주지 않고 리턴 값으로부터 추론하게 할 수도 있습니다.
function addToCart(id: string, quanity: number) {
if (어떤 조건) {
return false;
}
return true;
}
- 함수를 값으로 사용하는 경우 화살표 함수처럼 작성합니다.
(id: string, quanity: number) => boolean- Rest 파라미터는 배열 타입으로 씁니다. 값을 리턴하지 않는 경우 리턴 타입을 void로 할 수 있습니다.
(...ids: string[]) => void;
이미지 출처: <한 입 크기로 잘라먹는 타입스크립트>
https://www.inflearn.com/course/%ED%95%9C%EC%9E%85-%ED%81%AC%EA%B8%B0-%ED%83%80%EC%9E%85%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8?inst=68d752f7&utm_source=instructor&utm_medium=referral&utm_campaign=inflearn_%ED%8A%B8%EB%9E%98%ED%94%BD_promotion-link