一。배경
2010 – 마이크로소프트 팀이 개발 시작
2012 – 첫 공개 버전 릴리스 (TypeScript 0.8)
2013 – TypeScript 0.9 릴리스, 제네릭 지원
2014 – TypeScript 1.0 릴리스, Visual Studio 2013 이 기본적으로 TypeScript 지원. 동시에, 소스 코드를 CodePlex 에서 Github 로 이전
2017 – TypeScript 2.1 릴리스
2018 – TypeScript 3.2 릴리스
TypeScript 는 당초 마이크로소프트의 내부 프로젝트로, Strada 라고 불리며, 대규모 JS 프로젝트 (당시 내부 요구사항은 Bing Maps, Office Web Apps, 심지어 Windows 8 apps) 의 신뢰성과 유지보수성을 향상시키는 데 주력했습니다. 2010 년에 개발을 시작하여, 2012 년 10 월에 첫 오픈소스 버전을 릴리스하고, 현재까지 지속적으로 이터레이션하고 있습니다
二。목표
Application scale JavaScript development is hard.
JavaScript 는 당초 스크립트 언어로 설계되어, 대규모 애플리케이션을 구축하는 데 필요한 몇 가지 기초 특성이 부족했습니다. 예를 들어:
-
정적 타입
-
구조화 메커니즘 (클래스, 모듈, 인터페이스 등)
타입상의 결함으로 인해 많은 오류는 런타임이 되어야 비로소 노출됩니다. 한편, 정적 타입의 부재는 JS 편집 경험이 나쁜 주요 원인이기도 합니다. 인텔리센스, 자동 완성 등의 현대적인 편집 경험은 Visual Studio 에서 시작되었습니다:
-
타입 추론에 기반한 인텔리센스
-
JSDoc 에 기반한 인텔리센스
-
TypeScript 선언 파일에 기반한 인텔리센스
(JavaScript IntelliSense 에서 발췌)
Application scale JavaScript development is hard, TypeScript makes it easier.
TypeScript 는 소스 코드의 트랜스파일을 통해 이러한 결함을 메우고, JavaScript 에 OOP 지원 (Class, Interface 등) 과 옵션의 정적 타입 시스템을 추가하여, ES5 시대 (2010 년) 에 대규모 JavaScript 애플리케이션을 개발하는 기반을 구축하는 것을 기대하고 있습니다
게다가, TypeScript 는 JavaScript 에 또 하나의 중요한 것을 가져왔습니다. d.ts 선언 파일입니다:
Working with existing JavaScript libraries, declaration file can be written and maintained separately.
독립적인 선언 파일을 통해기존의 JavaScript 라이브러리에도 TypeScript 의 타입 우위성을 갖게 할 수 있어, JavaScript 편집 경험을 향상시키는 면에서 큰 한 걸음을 내디뎠습니다
三。위치付け
TypeScript is a typed superset of JavaScript that compiles to plain JavaScript.
3 가지 중요한 점이 있습니다:
-
typed: 타입화된. JS 에 (옵션의) 정적 타입을 보충
-
superset of JavaScript: 슈퍼셋. JS 와 호환성이 있으며, 혼용을 지원하고, 기존의 JavaScript 라이브러리는 직접 사용 가능
-
compiles to plain JavaScript: 네이티브 JS 로 컴파일. JavaScript 에서 시작하여 JavaScript 로 끝남
구체적으로는:
-
JavaScript 에서 시작: 슈퍼셋은 모든 JavaScript 코드가 TypeScript 임을 의미하며, 구문 시��틱스는 JavaScript 와 일치하고, 복사 붙여넣기로 시작할 수 있습니다
-
옵션의 정적 타입, 클래스와 모듈을 제공: 타입은 JavaScript 개발이 효율적인 개발 도구와 프랙티스 (정적 체크나 코드 리팩토링 등) 를 사용할 수 있게 할 뿐만 아니라, 런타임의 성능 손실을 가져오지 않습니다 (정적 타입은 컴파일 시에만 존재)
-
JavaScript 로 끝: TypeScript 는 본격적인 네이티브 JavaScript 를 컴파일 생성하므로, 최첨단의 JavaScript 특성을 지원하며, ES3+ 를 지원하는 임의의 호스트 환경에서 실행할 수 있습니다
TypeScript 는 JavaScript 의 문법 설탕 으로 생각할 수 있습니다:
TypeScript is a syntactic sugar for JavaScript. TypeScript syntax is a superset of ECMAScript 2015 (ES2015) syntax. Every JavaScript program is also a TypeScript program.
(Introduction | TypeScript Language Specification 에서 발췌)
타입 패치처럼, JavaScript 세계와 완벽하게 융합할 수 있는 것이 바로 TypeScript 의 생명력의 원천입니다:
Starts and ends with JavaScript, and optional static types, classes, modules.
게다가, 이 점은 TypeScript 가 공개 릴리스 (2012 년 말) 되어부터 현재 (2019 년 초) 까지 변하지 않았습니다
四。설계 원칙
추구:
-
정적으로 오류가 발생할 가능성이 있는 부분을 식별
-
대규모 코드에 구조화 메커니즘을 제공
-
컴파일 산물에 런타임 오버헤드를 추가하지 않음
-
클린하고 본격적이며 읽기 쉬운 JavaScript 코드를 출력
-
조합 가능하고 추론하기 쉬운 (easy to reason about) 언어를 구현
-
항상 ES 사양과 일치를 유지
-
모든 JavaScript 코드의 런타임 동작을 보유
-
식 레벨의 구문 특성을 추가하지 않음
-
일관된, 완전히 소거 가능한 구조화 타입 시스템
-
크로스플랫폼 개발 도구가 됨
-
TypeScript 1.0 부터 중대한 파괴적 변경을 도입하지 않음
거부:
-
기존 언어의 설계를 완전히 모방. JavaScript 의 동작과 개발자의 의도를 언어 설계 가이드로 해야 함
-
프로그램의 런타임 퍼포먼스를 최적화. 네이티브 JavaScript 코드를 충실히 출력하고, 의도적으로 최적화하지 않음
-
완전한 또는「증명 가능하게 올바른」타입 시스템. 정확성과 생산성 사이에서 균형을 취해야 함
-
엔드 투 엔드의 (닫힌) 빌드 파이프라인을 제공. 시스템을 확장 가능하게 하고, 컴파일러를 더 복잡한 빌드 워크플로우에 적용 가능하게 해야 함
-
런타임 타입 정보를 추가 또는 의존. 또는 타입 시스템의 결과에 기반하여 다른 코드를 생성. 런타임 정보 (run-time metadata) 에 의존하지 않는 프로그래밍 패턴을 장려해야 함
-
추가의 런타임 기능 또는 라이브러리를 제공. TypeScript 를 사용하여 기존의 라이브러리를 기술해야 함
-
사용자를 놀라게 할 가능성이 있는 동작을 도입. 다른 일반적인 언어가 채택하는 패턴을 적절히 고려해야 함
五。특성
타입 시스템
-
JavaScript 타입의 형식화: JavaScript 타입 동적 시스템의 정적 표현
-
타입 추론과 구조화 타입을 제공: 실제로는 모두에 타입을 주석할 필요는 없습니다 (타입 추론이 일부를 해결할 수 있습니다)
-
기존의 JavaScript 라이브러리와 연동하여 사용 가능: 선언 파일은 독립적으로 작성·보수할 수 있습니다
-
증명 가능한 타입 세이프 (provably type safe) 가 아님: 타입은 의도를 반영할 뿐, 보장을 제공하지 않습니다
가장 중요한 것은, 정적 타입은 컴파일 시에만 존재한다는 것입니다:
In the JavaScript output, all type annotations have been erased.
예를 들어:
// TypeScript
function f(s: string) {
return s;
}
// 컴파일로 얻어진 JavaScript, 타입 주석은 모두 소거
function f(s) {
return s;
}
게다가, TypeScript 는 정적 타입 시스템을 제공하고, 컴파일 시에 엄격하게 체크하지만, [Haskell 타입 시스템](/articles/타입-haskell 노트 3/) 처럼 증명 가능하고 추론 가능하지는 않습니다. 따라서, TypeScript 타입 시스템은 더 많이는 JavaScript 의 정적 타입 패치로서, 주석처럼「의도」를体现할 뿐, 안전을 보장하지 않습니다
게다가컴파일 오류는 코드 생성을 블록하지 않습니다. 타입 체크 오류는 여기에 문제가 존재할 가능성이 있음을 경고할 뿐입니다:
You can use TypeScript even if there are errors in your code. But in this case, TypeScript is warning that your code will likely not run as expected.
클래스와 모듈
-
확장 가능한 애플리케이션 구조화 메커니즘: 클래스, 모듈, 인터페이스는 컴포넌트 간의 명확한 관계를 정의하는 것을 지원
-
최신 표준에 준거: 클래스, 모듈, 화살표 함수 구문은 모두 ES6 표준과 일치
-
업계 주류의 모듈 시스템도 지원: CommonJS 나 AMD 모듈 등
주의, 모듈의 구문 규칙은 ES 표준과 일치하지만, 로드 메커니즘에는 차이가 있습니다. 자세한 내용은 Module Resolution 참조
六。에코시스템
-
(오픈소스) 컴파일러: typescript
-
도구: IDE 지원 (VS, VSCode, Sublime, WebStorm, Vim 등), Playground
-
타입 라이브러리: DefinitelyTyped
-
샘플 프로젝트: Samples, Community Samples
-
케이스: GitHub TypeScript 프로젝트 (Angular, ant-design 등을 포함)
참고 자료
-
Anders Hejlsberg: Introducing TypeScript: TypeScript 공개 릴리스 강연
-
TypeScript: 위 강연 대응의 PPT
아직 댓글이 없습니다