May 22, 2021
function getParam(index: number): string {
const params = this.splt(','); // this에서 컴파일 에러 발생
if (index < 0 || params.length <= index) {
return '';
}
return this.split(',')[index]; // this에서 컴파일 에러 발생
}
this.splt(',')
에서 splt
이 오타가 났는데도 splt
에서는 컴파일 에러가 발생하지 않는다.function getParam(this: string, index: number): string {
const params = this.splt(','); // splt에서 컴파일 에러 발생
if (index < 0 || params.length <= index) {
return '';
}
return this.split(',')[index];
}
this.splt(',')
의 splt
에서 컴파일 에러가 발생한다.function getParam(this: string, index: number): string {
// ...
}
String.prototype.getParam = getParam; // getParam에서 컴파일 에러 발생
console.log('asdf, 1234, ok '.getParam(1)); // getParam에서 컴파일 에러 발생
getParam
이라는 속성이 String 타입에 정의되어있지 않기 때문에 에러가 발생한다.function getParam(this: string, index: number): string {
// ...
}
interface String {
getParam(this: string, index: number): string;
}
String.prototype.getParam = getParam; // OK
console.log('asdf, 1234, ok '.getParam(1)); // OK
// 두 매개변수가 모두 문자열 -> 문자열 반환
// 두 매개변수가 모두 숫자 -> 숫자 반환
// 두 매개변수는 서로 다른 타입으로 입력하면 안됨
function add(x: number | string, y: number | string): number | string {
if (typeof x === 'number' && typeof y === 'number') {
return x + y;
} else {
const result = Number(x) + Number(y);
return result.toString();
}
}
const v1: number = add(1, 2); // v1에서 컴파일 에러
console.log(add(1, '2')); // OK이면 안되는데 OK
console.log(add(1, '2'));
에서는 두 매개변수가 서로 다른 타입으로 입력이 되었는데도 불구하고 문제 없이 호출을 하고 있다. 두 매개변수가 다른 타입으로 입력되면 안된다는 정의를 하지 않았기 때문이다.function add(x: number, y: number): number;
function add(x: string, y: string): string;
function add(x: number | string, y: number | string): number | string {
if (typeof x === 'number' && typeof y === 'number') {
return x + y;
} else {
const result = Number(x) + Number(y);
return result.toString();
}
}
const v1: number = add(1, 2); // OK
console.log(add(1, '2')); // add(1, '2')에서 컴파일 에러 발생
function add(x: number, y: number): number;
: 두 매개변수가 number 타입일 때는 number 타입을 반환function add(x: string, y: string): string;
: 두 매개변수가 string 타입일 때는 string 타입을 반환v1
에서는 더이상 컴파일 에러가 발생하지 않는다.add(1, '2')
에서 컴파일 에러가 발생한다.function getText({
name,
age = 15,
language
}: {
name: string,
age?: number;
language?: string;
}): string {
const nameText = name.substr(0, 10);
const ageText = age >= 35 ? 'senior' : 'junior';
return `name: ${nameText}, age: ${ageText}, language: ${language}`;
}
getText({name: 'jessie', language: 'javascript'});
interface TextParam {
name: string,
age?: number;
language?: string;
}
function getText({ name, age = 15, language }: TextParam): string {
const nameText = name.substr(0, 10);
const ageText = age >= 35 ? 'senior' : 'junior';
return `name: ${nameText}, age: ${ageText}, language: ${language}`;
}
getText({name: 'jessie', language: 'javascript'});
interface Person {
name: string;
age: number;
language?: string;
}
const p1: Person = { name: 'jessie', age: 23 };
const p2: Person = { name: 'kevin', age: 'eight' }; // age에서 컴파일 에러 발생
?
기호를 입력하면 선택 속성이 된다. 즉, 객체에서 없어도 되는 속성.language?: string
과 같은 형태가 아니라 language: string | undefined
와 같이 정의를 한다면 p1
과 p2
에서 컴파일 에러가 발생한다. (Property ‘language’ is missing in type ’{ name: string, age: number }’ but required in type ‘Person’.) 이것은 선택 속성과 다르다. language
을 항상 입력을 해야 하고 string이나 undefined로 정의를 해야한다.interface Person {
name: string;
age: number;
readonly address: string;
}
const p1: Person = { name: 'jessie', age: 23, address: 'suji' };
p1.age = 25; // OK
p1.address = 'yongin'; // address에서 컴파일 에러 발생
p1.address = 'yongin'
과 같이 값을 변경하려고 하면 컴파일 에러가 발생한다.interface Person {
readonly name: string;
age: number;
[key: string]: string | number;
}
const p1: Person = {
name: 'jessie',
age: '25', // 컴파일 에러 발생
birthday: '1997-01-01',
}
[key: string]: string | number;
: interface에서 속성 이름을 정의하지 않고 속성 값의 타입만 정의하는 것을 인덱스 타입이라고 한다. (여기에서 key
는 아무렇게나 입력해도 된다.)p1
은 birthday
라는 속성을 가지고 있는데 이는 Person
타입에 구체적으로 명시된 속성은 아니지만 인덱스 타입 정의로 인해 컴파일 에러가 발생하지 않는다.age
에서는 컴파일 에러가 발생하는데, 이 age
도 birthday
와 같이 인덱스 타입에 정의된 string | number
타입에 속하지만, Person
타입에서 age
라는 속성을 명시적으로 정의했고 그 타입을 number
로 정의했기 때문에 문자열로 입력된 p1
의 age
에서 컴파일 에러가 발생하는 것이다.interface Person {
name: string;
age: number;
}
interface Developer extends Person {
language: string;
position: string;
isJunior: boolean;
}
interface FrontendDeveloper extends Person, Developer {
hasTypeScriptSkill: boolean;
}
extends
라는 키워드를 이용하면 Interface를 확장해서 새로운 Interface를 만들 수 있다.interface Person {
name: string;
age: number;
}
interface Korean {
isLivingInSeoul: boolean;
}
type KoreanPerson = Person & Korean;
const p1: KoreanPerson = {
name: 'jessie',
age: 20,
isLivingInSeoul: false,
}
KoreanPerson
타입은 Person
과 Korean
의 모든 속성값을 포함한다.