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이면 안되는데 OKconsole.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의 모든 속성값을 포함한다.