Last active
February 10, 2019 13:50
-
-
Save seungha-kim/974b728e75304a5ab60d27285c9e589c to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
class Person { | |
name: string | |
age: number | |
constructor(name: string, age: number) { | |
this.name = name | |
this.age = age | |
} | |
} | |
class Student { | |
name: string | |
age: number | |
grade: number | |
constructor(name: string, age: number, grade: number) { | |
this.name = name | |
this.age = age | |
this.grade = grade | |
} | |
} | |
// printName 함수는 **Person 인스턴스 타입의 속성을 모두 가지는 객체를** 인수로 받을 뿐이다. | |
// 즉, name, age 속성만 갖고 있으면 printName에 인수로 넘길 수 있다. | |
function printName(p: Person) { | |
console.log(p.name) | |
} | |
const student = new Student('haha', 14, 5) | |
// Student가 Person을 상속하지 않았음에도 불구하고, | |
// 아래 코드는 타입 검사를 통과한다! | |
printName(student) | |
// 참고: 이 때, Student와 Person의 constructor 시그니처가 다르지만 | |
// constructor는 Person의 속성이 아니라 typeof Person의 속성이라 위 타입 체크에서 제외된다. | |
// 하지만, printName에서는 name 속성만을 사용하고 있으므로 | |
// 아무래도 위 코드보다는 아래 코드가 더 좋을 것이다. | |
interface HasName { | |
name: string | |
} | |
function printName2(obj: HasName) { | |
console.log(obj.name) | |
} | |
// 아래 코드도 타입 검사를 통과한다. | |
// 이 때 역시, student가 HasName 인터페이스와 같은 사용법을 가지고 있는지만을 검사한다. | |
printName2(student) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment