interface로 function을 정의하는 것은 call signature만 추가해주면 된다.
interface Func<T> {
(arg: T): T;
}
const num: Func<number> = (num) => num;
const str: Func<string> = (str) => str;
num(1);
str('1');
js에서는 function도 object이기 때문에, function자체가 callable 하면서, 또한 추가로 property도 가질 수 있다.
const func = () => {
return 123;
};
func.a = 'a';
console.log(func.a)
console.log(func())
만약 해당 function interface에 추가적인 property가 있다면 inferface에서는 아래와 같이 call signature와 property를 정의할 수 있다.
interface Func<T> {
(str: T): T; // call signature
validation: (str: T) => boolean; // 추가적인 function property
id: string; // 추가적인 property
}
const func: Func<string> = (str) => {
return str;
}
func.id = "1";
func.validation = () => true;
func('hi')
function은 type alias로 정의할 수 있다.
type Func<T> = (str: T) => T;
const func: Func<string> = (str) => {
return str;
}
func('hello')