Skip to content

Instantly share code, notes, and snippets.

@seungha-kim
Last active February 10, 2019 13:50
Show Gist options
  • Save seungha-kim/974b728e75304a5ab60d27285c9e589c to your computer and use it in GitHub Desktop.
Save seungha-kim/974b728e75304a5ab60d27285c9e589c to your computer and use it in GitHub Desktop.
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