//type AddFunction = (a: number, b: number) => number;
interface AddFunction {
(a: number, b: number): number;
}
let add: AddFunction;
// add: AddFunction이기 때문에 아래 n1: number를 string으로 바꿀 경우 작동하지 않는다.
add = (n1: number, n2: number) => {
return n1 + n2;
};
interface Named {
readonly name?: string;
outputName?: string;
// ?: string을 통해서 선택적으로 속성을 적용시킬 수 있다.
// 만약 outputName: string 경우 아래 class Person에 반드시 outputName 속성을 추가해야 작동한다. Person implements Greetable이기 때문에, 하지만 ?: string을 통해서 해결할 수 있다.
}
interface Greetable extends Named {
greet(phrase: string): void;
}
// Greetable에서 interface를 확장했을 때 Greetable에 name이 추가된 상태이기 때문에, class Person 내 name: string설정해야 합니다.
class Person implements Greetable {
name?: string;
age = 30;
constructor(n?: string){
// 선택적 사용자를 통해 조건문을 사용할 수 있다.
if(n){
this.name = n;
}
}
greet(phrase: string) {
if(this.name){
console.log(phrase + " " + this.name);
} else {
console.log("Hello No Provide Name");
}
}
}
let user1: Greetable
user1 = new Person();
user1.greet("Hello World I am");
console.log(user1);
?: 선택적 매개변수를 뜻한다.
?: string을 통해서 선택적으로 속성을 적용시킬 수 있다.
만약 outputName: string 경우 아래 class Person에 반드시 outputName 속성을 추가해야 작동한다. Person implements Greetable이기 때문에, 하지만 ?: string을 통해서 해결할 수 있다.
반대로 class Person에서 implements Greetable 사용했기 때문에, name?: string을 사용할 경우 Greetable에서 선택적 사용자가 아니기 때문에, 선택적으로 사용할 수 없다. 만약 class Person에서 name?: 선택적으로 사용하고 싶다면, Greetable에서 name?: string 선택적으로 바꿔주면 된다.