일반적으로 변수, 함수, 클래스에 타입 체크를 위해 사용된다.
직접 인스턴스를 생성할 수 없고 모든 메소드가 추상 메소드이다.
추상 클래스의 추상 메소드와는 달리 abstract키워드는 사용할 수 없다.
ES6는 인터페이스를 지원하지 않지만, TypeScript는 인터페이스를 지원한다.
Interface 사용 X
function hello(obj: {name: string}) {
console.log(obj.name);
}
let person = {name: "ho"};
hello(person);
Interface 사용 O
interface Person {
name: string
}
function hello(obj: Person) {
console.log(obj.name);
}
let person = {name: "ho"};
hello(person);
Interface를 추가하여 함수 매개변수 프로퍼티를 정의할 수 있다.
정의한 프로퍼티 값을 누락하거나 정의하지 않는 값을 인수로 전달 시 컴파일 에러가 발생한다.
interface person {
name: string
phone?: number
email?: string
}
function createUser(user:person): {name: string, phone:number, email:string} {
let newUser = {name: "newFace", phone:00000000000, email: ok@ok.com};
if (user.phone) {
newUser.phone = user.phone;
}
if (user.email) {
newUser.email = user.email;
}
return newUser;
}
let myUser = createUser({name: "faker"});
interface Point {
readonly x: number
readonly y: number
}
let point: Point = {x: 10, y: 20};
point.x = 5; // 에러
interface SearchFunc {
(source: string, substring: string): boolean
}
// 변수로 직접 함수 값이 할당되기때문에 인수 타입 생략 가능
// TypeScript의 문맨상 contextual typing
let mySearch: SearchFunc
mySearch = function (src, sub) {
let result = src.search(sub);
return result > -1;
// return "string" // 에러
}
interface Animal {
makeSound(): void
}
class Dog implements Animal {
makeSound(): void {
console.log("멍멍");
}
}
interface Animal {
makeSound(): void
}
interface Dog extends Animal {
speed: number
}
class Bulldog implements Dog {
makeSound(): void {
console.log("멍멍");
}
}
interface Counter {
(start: number): string
interval: number
reset(): void
}
function getCounter(): Counter{
let counter = function(start: number) {} as Counter
counter.interval = 123;
counter.reset = function () {}
return counter;
}
let c = getCounter();
c(10);
c.reset();
c.interval = 5.0;
function sort<T>(items: T[]): T[] {
return items.sort();
}
const nums: number[] = [1, 2, 3, 4];
const chars: string[] = ["a", "b", "c", "d"];
sort<number>(nums);
sort<string>(chars);
class Queue<T> {
protected data: Array<T> = [];
push(item: T) {
this.data.pupsh(item);
}
pop(): T|undefined {
return this.data.shift();
}
}
const numberQueue = new Queue<number>();
numberQueue.push(0);
numberQueue.push("1"); // 사전 검출 가능
numberQueue.push(+"1"); // 사전 검출 가능
1. Union type
const printMessage = (message: string|number) => {
return message;
}
const msg1 = printMessage(1234);
const msg2 = printMessage("hello");
msg1.length; // 에러 -> string과 number type의 공통된 메소드만 사용 가능
const msg = <T extends string|number> (message:T):T => {
return message;
}
msg<string>("1");
msg<number>(1);
msg<boolean>(false); // 에러
const pro = <T extends object, U extends keyof T> (obj:T, key: U) => {
return obj[key]
}
pro({a:1, b:2, c:3}, "a");
pro({a:1, b:2, c:3}, "z"); // 에러
interface Car {
drive(): void
park(): void
}
class Bus implements Car {
drive(): void{}
park(): void{}
}
class Taxi implements Car {
drive(): void {}
park(): void {}
}
class Suv implements Car {
drive(): void{}
park(): void{}
}
export class Car Factory{
static getInstance<T extends Car> (type: {new(): T}): T {
return new type();
}
}
const bus = CarFactory.getInstance(Bus);
const taxi = CarFactory.getInstance(Taxi);