
📅 2025-11-26
➡️ TypeSrcipt 타입 추론, interface, 타입 별칭에 대해 새롭게 알게 된 것 또는 헷갈리는 부분 정리
interface IUser {
name: string
age: number
isAdult: boolean
}
let user1: IUser = {
name: 'Neo',
age: 123,
isAdult: true
}
type User = {
name: string;
age: number;
isValid: boolean;
};
let userArr: User[] = [
{
name: "Neo",
age: 10,
isValid: true,
},
{
name: "Lewis",
age: 64,
isValid: false,
},
{
name: "Evan",
age: 123,
isValid: true,
},
];
null → 의도적으로 값 없음을 명시undefined → 값이 아직 정의되지 않음let undefin: undefined = undefined;
let nul: null = null;
let stringOrNull: string | null = null;
let numberOrUndefined: string | undefined = undefined;
|)let union: (string | number);
union = 'Hello World';
union = 777;
union = false; // Error&)A 이면서 B인 타입
interface User {
name: string,
age: number
}
interface Validation {
isValid: boolean
}
const testCase2: User & Validation = {
name: 'jisu',
age: 30,
isValid: true
}
let age: number = 20;
let name: string = "Neo";
let isAdult: boolean = true;
// number
let numbers: number[] = [1, 2, 3];
let names: string[] = ["a", "b", "c"];
// object
let user: { name: string; age: number } = {
name: "Neo",
age: 30,
};
// function arguments
function add(a: number, b: number) {
return a + b;
}
// function return
function getUser(): string {
return "Neo";
}함수가 any 타입을 리턴하고 이 값을 명확하게 해야 할 때
const json = '{"a": 1, "b": 2}';
const object = JSON.parse(json); // any 타입으로 인식 -> 타입 어노테이션 필요
console.log(object); // {a: 1, b: 2}
object.asdadsfgsdasdasdasd // 타입스크립트는 object를 any 타입으로 인식해서 이러한 에러를 찾지 못함
어떤 변수를 선언한 이후 다른 라인에서 초기화 할 때
const colors = ['red', 'blue', 'green'];
let foundColor; // 암묵적으로 any 타입을 가짐 -> 타입 어노테이션 필요
for (let i = 0; i < colors.length; i++) {
if (colors[i] === 'blue') foundColor = true;
}
추론할 수 없는 타입을 변수가 가지려고 할 때
let numbers = [-10, -5, 10];
let numberAboveZero = false; // boolean 타입으로 타입 추론 -> 타입 어노테이션 필요 boolean | number
for (let i = 0; i < colors.length; i++) {
if (numbers[i] > 0) numberAboveZero = numbers[i]; // error
}
let num = 10; // number로 추론
let str = "Hello"; // string으로 추론
let bool = true; // boolean으로 추론
let numbers = [1, 2, 3, 4, 5]; // number[]로 추론
let strings = ["a", "b", "c"]; // string[]로 추론
let person = {
name: "홍길동",
age: 25
}; // { name: string; age: number }로 추론
person.name = "김철수"; // 정상
person.age = 30; // 정상
person.age = "thirty"; // error: 'string' 형식은 'number' 형식에 할당할 수 없음
함수 반환 타입 추론
function add(a: number, b: number) {
return a + b; // number로 추론
}
const result = add(5, 3); // result는 number로 추론
let add = (a: number, b: number) => a + b;
// (a: number, b: number) => number로 추론
let numbers = [1, 2, 3, 4, 5];
numbers.forEach(num => {
console.log(num); // num은 number로 추론
});
let person = { name: '홍길동', age: 20 };
function logAge(obj: { age: number }) {
console.log(obj.age); // 20
}
logAge(person); // 20interface personAge {
age: number;
}
function logAge(obj: personAge) {
console.log(obj.age);
}
let person = { name: '홍길동', age: 20 };
logAge(person);interface Coffee {
name: string;
caffeine?: number;
}
let myCoffee = {
name: "Latte",
};
function brewCoffee(coffee: Coffee) {
console.log(coffee.name); // Latte
}
brewCoffee(myCoffee);caffeine으로 뒀기 때문에 myCoffee 객체에 caffeine 속성이 없어도 됨readonly)interface Coffee {
name: string;
caffeine?: number;
readonly brand: string;
}
const myCoffee: Coffee = {
name: "Latte",
caffeine: 80,
brand: "Starbucks",
};
// brand는 readonly이므로 변경 불가
myCoffee.brand = "Blue Bottle"; // errorReadonlyArray<T> 타입을 사용하면 읽기 전용 배열을 생성할 수 있음let arr: ReadonlyArray<number> = [1,2,3];
arr.splice(0,1); // error
arr.push(4); // error
arr[0] = 100; // errorinterface Coffee {
name?: string;
}
function serveCoffee(coffee: Coffee) {
console.log(coffee.name);
}
serveCoffee({ namme: "Americano" }); // erroras)let cup = {name: "latte"};
saveCoffee(cup as Coffee); // 강제로 통과interface Coffee {
name?: string;
[key: string]: any;
}
const latte = {
name: "Vanilla Latte",
size: "Grande",
shot: 2,
};
serveCoffee(latte); // OK확장성
interface Hello {
name: string
}
interface Hello {
age: number
}
// 가능, Hello 는 name 과 age 모두를 포함하게 됨
type Hello2 = {
name: string
}
type Hello2 = {
age: number
}
// 불가능