2018.02.05

타입스크립트 2.7, 무엇이 어떻게 달라졌나

Paul Krill | InfoWorld
마이크로소프트가 타입스크립트(Typescript) 2.7의 프로덕션 버전(production version)을 공개했다. 타입스크립트는 누겟(Nuget) 또는 NPM을 통해 다운로드할 수 있다. 'npm install -g typescript' 명령어를 사용하면 된다.



타입스크립트 2.7의 신 기능
타입스크립트 2.7은 크게 3가지 부분에서 개선됐다. 클래스 속성에 대한 더 명확한 할당 검사, 고정 길이 튜플, ininstanceof 연산자의 개선이다.

고정 길이 튜플의 경우 2.7버전부터 해당 요소의 수를 각각의 길이 속성 유형으로 인코딩하며, 각기 다른 유형의 튜플은 더 이상 할당할 수 없게 됐다. 이는 기존의 틀을 확 깨는 변화이다. 또한, 타입스크립트 2.7은 커몬JS(CommonJS) 모듈의 리팩토링 기능을 ECMAScript 6 에 추가한다. 이 버전은 ECMA 인터내셔널이 2015년 승인한 표준 자바스크립트 명세가 된다.

이밖에 타입스크립트 2.7의 또 다른 기능은 다음과 같다.

- 클래스 속성에 대한 명확한 할당 검사. 새로운 플래그 --strictPropertyInitialization은 클래스의 각 인스턴스 속성이 생성자 본문 또는 속성 초기화 프로그램에서 초기화되는지 확인하기 위해 검사를 수행한다. 컴파일러 옵션의 플래그는 다른 -- strict 모드 플래그와 함께 켜진다. 이 확인 기능을 끄려면 tsconfig.jsoncompilerOptions에서 -- strictPropertyInitialization 설정을 false로 설정하거나 명령 줄에서 -strictPropertyInitialization false를 설정하면 된다.
- 인(in)인스턴스오브(instanceof) 연산자의 범위 축소와 관련된 개선. 이제 in 연산자는 유형에 대한 축소 표현식 역할을 한다. 유형은 지정된 이름의 특성을 명시적으로 선언하지 않는다. instanceof 연산자는 구조적 호환성에 의존하기보다 상속 체인을 활용한다. 이는 instanceof 연산자가 런타임에 어떻게 작용하는지 더 정확하게 반영할 것이다.
- 변수 또는 속성 선언(property declaration)의 변수 또는 속성 식별자 이후에 '!' 문자 형태로 명확한 할당이 포함될 수 있는 명확한 할당 검사. 이러한 선언은 컨트롤 플로우 애널라이저(control flow analyzer)를 지시해 설령 애널라이저가 증명할 수 없다고 해도 명확히 할당된 변수를 고려하도록 한다.
- 프리티 플래그(pretty flag)를 에러 메시지를 더 읽기 쉽도록 개선. 타입스크립트 2.7은 파일명과 진단 코드, 그리고 줄번호에 색깔을 사용하도록 추가했다. 또한 커먼 터미널(common terminals)에서 Ctrl-click, Cmd-click, Alt-click을 이용해 개발자 에디터 내의 적절한 위치로 점프할 수 있도록 파일명과 포지션이 형성됐다.
- ECMAScript numeric separator에 대한 지원. 자릿수 간 구분자(separator)를 위치시켜 자릿수 그룹들을 서로 구별한다.

타입스크립트 2.6의 새로운 기능
2017년 10월 출시된 타입스크립트 2.6은 strict 모드 플래그가 도입됐으며, 이 모드 플래그는 --strictFunctionTypes으로 식별된다. 마이크로소프트의 타입스크립트 프로그램 매니저 대니얼 로젠워서에 따르면, strict 모드에서는 메소드(method)에서 비롯되지 않은 모든 함수 유형이 '반항적으로(contravariantly)' 비교된 매개 변수를 갖게 된다.

기존까지 타입스크립트는 매개 변수를 '2진(bivariant)' 방식으로 비교해 왔다. 이 방식은 배열 작업에 더 단순한 모델을 적용할 수 있다는 장점이 있다. 타입스크립트 2.6은 메소드를 제외한 모든 함수 유형에 대해 엄격성(trictness)을 강화하면서도 타입스크립트가 계속해서 이벤트 핸들러(event handler) 및 간단한 배열 처리와 같은 사용례를 모델링 할 수 있도록 해 중간에서 합의점을 도출한다.

타입스크립트 2.6에서 소개된 다른 신기능이 오류 방지 코멘트(error suppression comment)다. 이 기능은 // @ts-ignore 코멘트를 통해 도입된다. 마이크로소프트는 타입스크립트에서 오류 방지를 기피해 왔는데 대부분 사용자가 이를 요청한 경우 더 정확한 선언 파일을 통해, 혹은 any 유형 검사(type assertion)를 통해 해결할 수 있었기 때문이다.

로젠워서는 "그러나 우리에게 변화를 시도할 동기를 부여해 준 두 가지 사례가 있었다. 하나는 자바스크립트에서 타입스크립트로의 이전이고, 다른 하나는 레거시 코드에 상주하는 유형 검사를 극복한 것이었다"라고 말했다.

자바스크립트에서 타입스크립트로의 이전 시 개발자가 모델링하기 어려운 패턴에 직면한 상황에서 오류 방지가 도움이 될 수 있다. 개발자가 직접 그 패턴을 파악 하려 시도해 볼 수도 있지만 대부분은 이를 추후에 처리하려 미뤄둔다. 이제는 오류 방지 코멘트를 이용해 코드는 정상적으로 가동되면서 오류를 피할 수 있다.

레거시 코드의 유형 검사를 극복하기 위해 일부 기업은 프로젝트 종속성을 동시에 업데이트 한다. 유형 검사 오류를 유발하는 모든 종류의 변경 사항은 빌드를 위반하지 않도록 수정돼야 한다. 로센워서는 "대부분의 경우 이러한 오류가 유용하지만, 현실적으로 생각했을 때 그 동안 코드가 어찌 됐든 제 기능을 해왔으며 팀의 자원은 한정적이라는 사실을 무시할 수 없다"라고 말했다. 마이크로소프트는 오류 방지 코멘트를 제한적으로만 사용하고, 사용시 반드시 이를 공표하고 설명할 것을 조언한다.

타입스크립트 2.6의 또 다른 기능은 다음과 같다.

- 최초 호출 이후에 모듈 태그가 지정된 템플릿 문자열을 캐시한다. 이 작업은 타입스크립트를 자바스크립트 기저의 EMCAScript 사양에 근접하게 수정한다. 이로 인해 개발자는 Lit-html이나 HyperHTML과 같은 라이브러리를 사용할 수 있다.
- 독립 실행형 타입스크립트 컴파일러가 이제 --local 플래그 사용시 국지화 된 메시지를 NPM을 통해 제공한다.
- 모듈을 방출하는 --watch 모드의 속도가 더 빨라졌다.
- 비주얼 스튜디오(Visual Studio), 비주얼 스튜디오 코드(Visual Studio Code)와 같은 툴을 위한 툴 지원 개선이 예정돼 있다. 여기에는 any에 대한 속성 수정도 포함돼 있으며, 타입스크립트는 암시적 any 유형에 대해 선언 유형을 유추할 수 있다.
- 개발자가 JSDoc 문서 코멘트를 타입스크립트 주석에 리팩토링 할 수 있다.
- 편집자는 유형이 지정되지 않은 가져오기(imports)에 대해 유형 선언을 인스톨하도록 속성 수정을 가할 수 있다.
- 타입스크립트 2.6은 상당한 변경 사항을 포함하고 있다. noUnusedLocalsnoUnusedParameters에서 사용되지 않은 것으로 간주하는 쓰기 전용 레퍼런스도 그 중 하나이다.
lib.d.ts의 DOM 선언에 대한 조직적 변화가 가해졌다.
- 선언 파일 및 선언 모듈 블록과 같은 환경적 맥락에서는 디폴트 내보내기가 허용되지 않는다.
- 이제 noUnusedLocals 및 noUnusedParameters에서 쓰기 전용 레퍼런스는 사용되지 않은 것으로 간주된다.
- 번호와 문자열(:"foo" & 42와 같은)과 같은 교차점에서 발생하는 거주 불가능한 유형은 결합 시 never로 단순화 된다.


타입스크립트 2.5의 새로운 기능들
2017년 9월 출시된 타입스크립트 2.5는 컴파일러 개선과 오류에 대한 try/catch 명령문을 강화했다. 타입스크립트 2.5의 catch 바인딩 매개 변수 기능은 후기 ECMAScript 기능을 이용해 try/catch 명령문에서 catch 바인딩을 선택적으로 만들었다. 이는 unusedError를 완전히 삭제할 수 있다는 의미다. 이유는 개발자가 오류를 던져 무언가가 실패할 것이라고 예상하면서도 그 오류가 무엇인가에 대해서는 신경 쓰지 않는 경우가 있기 때문이다.

이밖에 타입스크립트 2.5의 또 다른 기능은 다음과 같다.

- Node 모듈-레솔루션 전략을 이용 시 가져오기 지원. 컴파일러는 파일이 '같은' 패키지에서 유래했는지를 검사한다. 만약 해당 파일이 이전 패키지와 같은 버전 필드 및 이름을 포함한 package.json에서 유래됐다면, 타입스크립트는 가장 상단의 패키지로 이를 리디렉팅한다. 이를 통해 두 개의 패키지가 같은 클래스 선언을 가지면서 이 둘을 구조적으로 양립 불가능하게 만드는 '프라이빗 멤버' 상황을 해결한다. 단, 대신 컴파일러와 언어 서비스의 메모리 및 런타임 풋프린트 감소를 감내해야 한다.
- preserveSymlinks 컴파일러 플래그는 Node.js에서 모듈을 캐싱 및 해소할 때 심볼 링크를 유지하도록 모듈 로더에 지시를 내리는 -preserveSymlinks 플래그와 유사하다. ciokr@idg.co.kr
2018.02.05

타입스크립트 2.7, 무엇이 어떻게 달라졌나

Paul Krill | InfoWorld
마이크로소프트가 타입스크립트(Typescript) 2.7의 프로덕션 버전(production version)을 공개했다. 타입스크립트는 누겟(Nuget) 또는 NPM을 통해 다운로드할 수 있다. 'npm install -g typescript' 명령어를 사용하면 된다.



타입스크립트 2.7의 신 기능
타입스크립트 2.7은 크게 3가지 부분에서 개선됐다. 클래스 속성에 대한 더 명확한 할당 검사, 고정 길이 튜플, ininstanceof 연산자의 개선이다.

고정 길이 튜플의 경우 2.7버전부터 해당 요소의 수를 각각의 길이 속성 유형으로 인코딩하며, 각기 다른 유형의 튜플은 더 이상 할당할 수 없게 됐다. 이는 기존의 틀을 확 깨는 변화이다. 또한, 타입스크립트 2.7은 커몬JS(CommonJS) 모듈의 리팩토링 기능을 ECMAScript 6 에 추가한다. 이 버전은 ECMA 인터내셔널이 2015년 승인한 표준 자바스크립트 명세가 된다.

이밖에 타입스크립트 2.7의 또 다른 기능은 다음과 같다.

- 클래스 속성에 대한 명확한 할당 검사. 새로운 플래그 --strictPropertyInitialization은 클래스의 각 인스턴스 속성이 생성자 본문 또는 속성 초기화 프로그램에서 초기화되는지 확인하기 위해 검사를 수행한다. 컴파일러 옵션의 플래그는 다른 -- strict 모드 플래그와 함께 켜진다. 이 확인 기능을 끄려면 tsconfig.jsoncompilerOptions에서 -- strictPropertyInitialization 설정을 false로 설정하거나 명령 줄에서 -strictPropertyInitialization false를 설정하면 된다.
- 인(in)인스턴스오브(instanceof) 연산자의 범위 축소와 관련된 개선. 이제 in 연산자는 유형에 대한 축소 표현식 역할을 한다. 유형은 지정된 이름의 특성을 명시적으로 선언하지 않는다. instanceof 연산자는 구조적 호환성에 의존하기보다 상속 체인을 활용한다. 이는 instanceof 연산자가 런타임에 어떻게 작용하는지 더 정확하게 반영할 것이다.
- 변수 또는 속성 선언(property declaration)의 변수 또는 속성 식별자 이후에 '!' 문자 형태로 명확한 할당이 포함될 수 있는 명확한 할당 검사. 이러한 선언은 컨트롤 플로우 애널라이저(control flow analyzer)를 지시해 설령 애널라이저가 증명할 수 없다고 해도 명확히 할당된 변수를 고려하도록 한다.
- 프리티 플래그(pretty flag)를 에러 메시지를 더 읽기 쉽도록 개선. 타입스크립트 2.7은 파일명과 진단 코드, 그리고 줄번호에 색깔을 사용하도록 추가했다. 또한 커먼 터미널(common terminals)에서 Ctrl-click, Cmd-click, Alt-click을 이용해 개발자 에디터 내의 적절한 위치로 점프할 수 있도록 파일명과 포지션이 형성됐다.
- ECMAScript numeric separator에 대한 지원. 자릿수 간 구분자(separator)를 위치시켜 자릿수 그룹들을 서로 구별한다.

타입스크립트 2.6의 새로운 기능
2017년 10월 출시된 타입스크립트 2.6은 strict 모드 플래그가 도입됐으며, 이 모드 플래그는 --strictFunctionTypes으로 식별된다. 마이크로소프트의 타입스크립트 프로그램 매니저 대니얼 로젠워서에 따르면, strict 모드에서는 메소드(method)에서 비롯되지 않은 모든 함수 유형이 '반항적으로(contravariantly)' 비교된 매개 변수를 갖게 된다.

기존까지 타입스크립트는 매개 변수를 '2진(bivariant)' 방식으로 비교해 왔다. 이 방식은 배열 작업에 더 단순한 모델을 적용할 수 있다는 장점이 있다. 타입스크립트 2.6은 메소드를 제외한 모든 함수 유형에 대해 엄격성(trictness)을 강화하면서도 타입스크립트가 계속해서 이벤트 핸들러(event handler) 및 간단한 배열 처리와 같은 사용례를 모델링 할 수 있도록 해 중간에서 합의점을 도출한다.

타입스크립트 2.6에서 소개된 다른 신기능이 오류 방지 코멘트(error suppression comment)다. 이 기능은 // @ts-ignore 코멘트를 통해 도입된다. 마이크로소프트는 타입스크립트에서 오류 방지를 기피해 왔는데 대부분 사용자가 이를 요청한 경우 더 정확한 선언 파일을 통해, 혹은 any 유형 검사(type assertion)를 통해 해결할 수 있었기 때문이다.

로젠워서는 "그러나 우리에게 변화를 시도할 동기를 부여해 준 두 가지 사례가 있었다. 하나는 자바스크립트에서 타입스크립트로의 이전이고, 다른 하나는 레거시 코드에 상주하는 유형 검사를 극복한 것이었다"라고 말했다.

자바스크립트에서 타입스크립트로의 이전 시 개발자가 모델링하기 어려운 패턴에 직면한 상황에서 오류 방지가 도움이 될 수 있다. 개발자가 직접 그 패턴을 파악 하려 시도해 볼 수도 있지만 대부분은 이를 추후에 처리하려 미뤄둔다. 이제는 오류 방지 코멘트를 이용해 코드는 정상적으로 가동되면서 오류를 피할 수 있다.

레거시 코드의 유형 검사를 극복하기 위해 일부 기업은 프로젝트 종속성을 동시에 업데이트 한다. 유형 검사 오류를 유발하는 모든 종류의 변경 사항은 빌드를 위반하지 않도록 수정돼야 한다. 로센워서는 "대부분의 경우 이러한 오류가 유용하지만, 현실적으로 생각했을 때 그 동안 코드가 어찌 됐든 제 기능을 해왔으며 팀의 자원은 한정적이라는 사실을 무시할 수 없다"라고 말했다. 마이크로소프트는 오류 방지 코멘트를 제한적으로만 사용하고, 사용시 반드시 이를 공표하고 설명할 것을 조언한다.

타입스크립트 2.6의 또 다른 기능은 다음과 같다.

- 최초 호출 이후에 모듈 태그가 지정된 템플릿 문자열을 캐시한다. 이 작업은 타입스크립트를 자바스크립트 기저의 EMCAScript 사양에 근접하게 수정한다. 이로 인해 개발자는 Lit-html이나 HyperHTML과 같은 라이브러리를 사용할 수 있다.
- 독립 실행형 타입스크립트 컴파일러가 이제 --local 플래그 사용시 국지화 된 메시지를 NPM을 통해 제공한다.
- 모듈을 방출하는 --watch 모드의 속도가 더 빨라졌다.
- 비주얼 스튜디오(Visual Studio), 비주얼 스튜디오 코드(Visual Studio Code)와 같은 툴을 위한 툴 지원 개선이 예정돼 있다. 여기에는 any에 대한 속성 수정도 포함돼 있으며, 타입스크립트는 암시적 any 유형에 대해 선언 유형을 유추할 수 있다.
- 개발자가 JSDoc 문서 코멘트를 타입스크립트 주석에 리팩토링 할 수 있다.
- 편집자는 유형이 지정되지 않은 가져오기(imports)에 대해 유형 선언을 인스톨하도록 속성 수정을 가할 수 있다.
- 타입스크립트 2.6은 상당한 변경 사항을 포함하고 있다. noUnusedLocalsnoUnusedParameters에서 사용되지 않은 것으로 간주하는 쓰기 전용 레퍼런스도 그 중 하나이다.
lib.d.ts의 DOM 선언에 대한 조직적 변화가 가해졌다.
- 선언 파일 및 선언 모듈 블록과 같은 환경적 맥락에서는 디폴트 내보내기가 허용되지 않는다.
- 이제 noUnusedLocals 및 noUnusedParameters에서 쓰기 전용 레퍼런스는 사용되지 않은 것으로 간주된다.
- 번호와 문자열(:"foo" & 42와 같은)과 같은 교차점에서 발생하는 거주 불가능한 유형은 결합 시 never로 단순화 된다.


타입스크립트 2.5의 새로운 기능들
2017년 9월 출시된 타입스크립트 2.5는 컴파일러 개선과 오류에 대한 try/catch 명령문을 강화했다. 타입스크립트 2.5의 catch 바인딩 매개 변수 기능은 후기 ECMAScript 기능을 이용해 try/catch 명령문에서 catch 바인딩을 선택적으로 만들었다. 이는 unusedError를 완전히 삭제할 수 있다는 의미다. 이유는 개발자가 오류를 던져 무언가가 실패할 것이라고 예상하면서도 그 오류가 무엇인가에 대해서는 신경 쓰지 않는 경우가 있기 때문이다.

이밖에 타입스크립트 2.5의 또 다른 기능은 다음과 같다.

- Node 모듈-레솔루션 전략을 이용 시 가져오기 지원. 컴파일러는 파일이 '같은' 패키지에서 유래했는지를 검사한다. 만약 해당 파일이 이전 패키지와 같은 버전 필드 및 이름을 포함한 package.json에서 유래됐다면, 타입스크립트는 가장 상단의 패키지로 이를 리디렉팅한다. 이를 통해 두 개의 패키지가 같은 클래스 선언을 가지면서 이 둘을 구조적으로 양립 불가능하게 만드는 '프라이빗 멤버' 상황을 해결한다. 단, 대신 컴파일러와 언어 서비스의 메모리 및 런타임 풋프린트 감소를 감내해야 한다.
- preserveSymlinks 컴파일러 플래그는 Node.js에서 모듈을 캐싱 및 해소할 때 심볼 링크를 유지하도록 모듈 로더에 지시를 내리는 -preserveSymlinks 플래그와 유사하다. ciokr@idg.co.kr
X