[ Typescript ] - 'string'.length 와 Generic의 extends

최문길·2023년 12월 23일
0

typescript 일지

목록 보기
3/5

Generic을 공부하다가 이런 응용을 보았었다.

interface Length {
  lenth : number
}

function 함수<MyType extends Length>(x: MyType) {
  return x.length
}

let a = 함수<string>('hello')  //가능

'hello' 는 문자열인데,
interface는 객체이고 타입을 extends 하는데 문자열이 왜 가능한지 ....




문자열 리터럴(작은 따옴표 또는 큰 따옴표로 생성되는)과 생성자 없이(즉. new 키워드를 사용하지 않고) String을 호출하여 반환된 문자열은 원형 문자열(primitive strings)입니다. JavaScript는 자동적으로 원형을 String 오브젝트로 변환하기 때문에, String 오브젝트 메서드를 사용하여 원형문자열을 생성할 수 있습니다.

Mdn String에서

문자열을 자바스크립트에서 입력하면 자동적으로 primitive
String object로 변환하기 때문에 String 오브젝트 메서드를 사용할 수 있다.




그러므로 문자열을 입력하면 타입은 문자열 이지만, String 객체를 사용 할 수 있으므로 타입 허용이 가능하다는 이야기이다.



interface Length {
  lenth : number
}

function 함수<MyType extends Length>(x: MyType) {
  return x.length
}

let a = 함수<string>('hello')  //가능

'hello' 는 타입이 문자열이지만 String 객체로 변환하기에 
String {} 객체와 유사하다. 

어? 그렇다면 Generic에서 extends는 제한한다는 의미로 알았는데...



Generic - extends의 의미

  • 동등이아니라 포함
  • 최소한 만족한다.

interface Length {
  lenth : number
}

function 함수<MyType extends Length>(x: MyType) {
  return x.length
}

let a = 함수<string>('hello')  //가능
let a = r({length:2,value:2}) // 가능

정확히 위의 코드에서는 extends의 의미는 minimum 이라는 의미이다.




function 함수<MyType extends string>(x: MyType) {
  return x.length
}

let a = 함수<string>('hello')  //가능
let a = r({length:2,value:2}) // 불가능가능

여기서의 extends는 string이 minimum 이라는 의미이다.
왜?

  • string이 minimum 이라는 의미는 string으로 제한하는 의미와 일맥 상통한다.

0개의 댓글