// x는 unknown이 가득한 array
function 함수(x : unknown[]){
	return x[0]
}

// a는 unknown 타입
let a = 함수([4,2]);

// a기 unknown 이라 에러발생.
console.log(a + 1);

스크린샷 2022-08-26 오전 9.57.42.png


제네릭

파라미터로 타입을 입력하는 함수

function 함수<T>(x : T[]){
	return x[0]
}

// number라는 타입을 파라미터로 넘겨서 박음.
let a = 함수<number>([4,2]);
// string라는 타입을 파라미터로 넘겨서 박음.
let b = 함수<string>(['4','2']);

console.log(a + 1);

스크린샷 2022-08-26 오전 10.01.41.png

// MyType으로 뭐가 들어올줄 알고 - 1 을 하냐 해서 에러
function 함수<MyType>(x : MyType){
	return x - 1;
}

// extend는 오른쪽에 있는 number타입 속성인지 아닌지 체크한다. (narrowing)
function 함수<MyType extends number>(x : MyType){
	return x - 1;
}

let a = 함수<number>(100);

///
interface LengthCheck {
	length : number
}
// number인지 확인
function 함수<MyType extends LengthCheck>(x : MyType){
	return x.length
}

function makeLength<T extends string | string[]>(x: T) {
  return x.length;
}

const stringLength = makeLength<string>('hello');
const arrayLength = makeLength<string[]>(['kim', 'park']);
interface Animal {
  name: string;
  age: number;
}

let data = '{"name" : "dog", "age" : 1 }';

function makeToObj<T>(x: string): T {
  return JSON.parse(x);
}

const result = makeToObj<Animal>(data);
console.log(result);

class에 적용

class Person<T> {
  name;
  constructor(a: T) {
    this.name = a;
  }
}
let a = new Person<string>('어쩌구');
a.name; //any 타입이 되었넹