TypeScript와 Dart의 차이점 [닫기]


85

Microsoft는 최근 JavaScript와 같은 새로운 프로그래밍 언어 인 Typescript를 발표했습니다. 얼마 전에 저는 성능, 확장 성 등과 같은 Javascript 관련 문제를 해결하기 위해 Google에서 만든 새로운 프로그래밍 언어 인 Dart에 대해 들었습니다.

두 가지 새로운 언어의 목적은 나에게 동일하게 보입니다. 어떻게 생각하십니까?

언어의 목적이 동일합니까?

그들에 대한 실제 차이점은 무엇입니까?


답변:


60

인용 밥 Nystrom :

JS 의미를 좋아하거나 투자 한 대형 JS 코드베이스가 있지만 유지 관리 문제가있는 경우 TypeScript가 멋지게 보입니다. JS와 역 호환되므로 (주로?) 성공의 길은 훨씬 매끄 럽습니다.

다트는 더 위험한 내기를하고 있습니다. JS와는 거리가 멀기 때문에 매일 Dart 프로그래머에게는 좋지만 진입 장벽이 높아집니다. 그러나 진입 장벽이 높아지면 다음과 같은 이점이 있습니다.

  • 흔들리는 나무
  • 게터와 세터 (TypeScript가 결국에는 얻을 것이라고 가정하지만)
  • 연산자 과부하
  • 실제 블록 범위, 아니 게양, 아니 인생의 S 없다
  • 기본 VM
  • Sane 평등 시맨틱
  • 묵시적인 암시 적 전환이 없습니다.
  • 사 전적으로 this 모든 곳에 묶여있다
  • 믹스 인
  • 주석
  • 수입 시스템
  • 사용자 정의 첨자 연산자
  • 통일 된 제네릭
  • 거울
  • 더 나은 수집 수업
  • 깔끔한 DOM API

또한 그는 http://www.reddit.com/r/programming/comments/10rkd9/welcome_to_typescript/c6g37xd에 씁니다 .

저는 Google Dart 팀에 속해 있으므로 자연스럽게 해당 각도 / 바이어스에서보고 있습니다. 여기에 다트와 비교할 때 내 눈에 띄는 임의의 물건이 있습니다. 나는 몇 분 동안 만 훑어 보았으므로 너무 심각하게 생각하지 마십시오 ...

제네릭 없음

나는 어떤 유형이 전혀없는 유형보다 낫다고 생각하지만 잃어 버리는 것은 정말 거칠습니다. TypeScript에는 내장 배열 유형이 있으며 객체 유형은 일부 "맵"유형 사용 사례를 포괄합니다. 그러나 고유 한 제네릭 형식을 정의 할 수없는 것은 드래그입니다. 문서에 따르면 제네릭은 유형 소거를 사용하여 작동합니다. "경량 JS로 컴파일"스타일을 감안할 때 기대되는 것이지만 너무 고통 스럽습니다. 때로는 런타임에 타입 인수로 작업을 수행하는 것이 좋습니다.

모든 유형은 널 입력 가능

다트도 마찬가지입니다. 두 경우 모두 나를 슬프게합니다.

타입 주석 구문이 좋습니다

선택적 유형 주석 (ML, Scala, F #, Kotlin 등)이있는 거의 모든 언어는 ": 뒤에 붙은 접미사를 사용합니다. Dart는 C 스타일의 유형 주석을 사용하려고합니다. 특히 함수 유형에 대한 구문 :

function takeCallback(callback : (n : number) => number)
{ ... }

인터페이스는 구조적으로 형식화되고 클래스는 명목상 형식화됩니다

JavaScript라는 점을 감안하면 이해가되지만 깔끔하게 보입니다. 암시 적으로 인터페이스를 구현할 수 있다는 것이 좋습니다. 그러나 TypeScript는 다른 방법으로 갈 수없는 것처럼 보입니다. 클래스가 주어지면 브랜드로 인해 구체적으로 확장하지 않으면 호환되는 새 유형을 만들 수 없습니다. Dart에서는 암시 적 인터페이스 덕분에 가능합니다.

가장 일반적인 유형은 실패 할 수 있습니다

이것은 이것이 유형 오류임을 의미합니다.

[1, true]

매개 변수 서명으로 인터페이스에 과부하가 발생할 수 있습니다

동적 유형 전환을 수행하는 함수 호출을 통해보다 정확한 유형 유추 흐름을 가질 수 있기 때문에 정말 좋습니다. 예를 들면 다음과 같습니다.

interface Doubler {
  double(s : string) : string;
  double(n : number) : number;
}

이를 통해 컴파일러가 double에 대한 호출을 볼 때 유추 된 인수 유형을 기반으로 정확한 반환 유형을 정확하게 제공 할 수 있습니다. 확실하지 않은 것은 실제로 해당 인터페이스를 구현하고 유형 검사기를 행복하게 만드는 클래스를 구현하는 방법입니다. 실제로 구체적인 방법을 오버로드 할 수 없으며 5 분 동안 동적 유형 검사로 행복하게 만들려고 시도하지 않았습니다.

배열 유형에 대한 전용 구문이 있습니다

제네릭이 없으므로 의미가 있습니다. 또한 훌륭하고 간결합니다.하지만 개인적으로 일회용 케이스보다 범용 제네릭을 선호합니다.

암시 적 다운 캐스팅이 없습니다

Dart의 더 일반적인 유형 시스템 기능 중 하나는 할당 호환성이 양방향이라는 것입니다. 경고없이 다운 캐스트 할 수 있습니다. TypeScript는 다른 언어로 동적으로 할당하는 일반적인 특수한 경우를 제외하고는 허용하지 않습니다. assert를 입력해야합니다. 개인적으로 TypeScript의 접근 방식이 좋습니다.

화살표 기능과 어휘

이것은 단지 모성과 사과 파이입니다. 나는 그것을 좋아한다. (Dart도 이것을 가지고 있으며 이것은 항상 어휘 적으로 묶여 있습니다.)

전반적으로, 그것은 깔끔하게 보입니다. 정확히 동일한 JS 의미를 원하지만 좋은 유형을 원한다면 TypeScript는 괜찮은 것처럼 보입니다. Closure Compiler와 비슷하지만 구문이 더 좋습니다.

JS의 구문과 의미에서 더 적극적인 단계를 원한다면 TypeScript가 아닌 것 같습니다.


17
나무 흔들림이란 무엇입니까?
citykid

4
나무 흔들림에 대한 자세한 내용 : blog.sethladd.com/2013/01/…
Seth Ladd

19
"다트 툴은 사용되지 않는 코드를"흔들어 "제거하는 기술인 트리 흔들림을 지원하므로 배포 된 응용 프로그램의 크기가 줄어 듭니다. 유용한 라이브러리가 가득한 풍부한 라이브러리를 내 응용 프로그램으로 가져올 수 있지만 실제로 사용하는 기능 만 포함됩니다. 생성 된 출력에서. " thx
citykid

3
미리보기 상태에있는 동안 Typescript는 내일 출시 될 전문 프로젝트에서 사용하기에 완벽한 형태입니다. 언어 및 도구는 심각한 문제없이 또는 전혀 문제가되지 않습니다.
citykid

4
@JustAnotherUserYouMayKnowOrNot가 언급했듯이 TypeScript는 0.9 blogs.msdn.com/b/typescript/archive/2013/06/18/…
Jon Mabe

60

문제는 "언어의 목적이 동일합니까?"였지만 실제 질문은 "우리가있는 곳에서 어떻게 웹 프로그래밍을 개선 할 수 있는가?"입니다. .

두 프로젝트 모두 고려 하여이 작업을 수행하려고합니다.

  • 프로그래밍 언어 (TypeScript는 작지만 매우 깔끔한 단계를 수행하고 Dart는 여전히 움직이고있는보다 혁신적인 움직임을 만듭니다)

  • 기존 js 코드와의 상호 운용성 (2 개의 VM이 서로 대화하기 때문에 Dart에서는 복잡한 js로 컴파일되는 TypeScript의 0 전환, Dart에서는 복잡함)

  • 소프트웨어 엔지니어링 관행 (다트 만, 웹 구성 요소 및 그림자 돔)

지난 3 일 동안 나는 Dart와 TypeScript를 깊이 파고 들었다. 내 CoffeeScript 코드베이스는 2000 년대 코드 라인으로 넘어갔지 만 너무 많지만 푹신한 CoffeeScript로 처리하기에는 너무 많았습니다. 내가 직면 한 문제는 CoffeeScript에 중대형 프로그래밍을 위해 설계된 언어 (인터페이스, 모듈, 유형 안전)가 가지고있는 기능이 없다는 것입니다. 그러나 커피와 js에는 훨씬 더 심각한 문제가 있습니다. js "이 포인터"의 이상이 내 정신에 영향을 미쳤으며 CoffeeScript는 여기에 아무것도 도움이되지 않습니다.

따라서 3 일간의 평가 및 사용 후 내 결과는 다음과 같습니다.

다트

튜토리얼, 1 권의 책을 읽고, 2 권의 책을 감추고 데모를 시도했습니다. 나는 다트가 미래라고 생각했다 . 그런 다음 앱을 다트 로 마이그레이션하려고했습니다 . 저의 열의는 100에서 10으로 떨어졌습니다. 그 이유는 다음과 같습니다.

  1. 다트 편집기 다트를 프로그램 할 수있는 유일한 방법입니다. Sublime Text 용 플러그인이 있지만 인텔리전스, 코드 완성 (잘못된 경우 올바른 수정)과 같은 기능을 제공하지 않습니다. 그러나 Dart Editor는 사전 알파 품질입니다. CSS 파일을 편집 할 때 웹 페이지를 업데이트하는 것과 같은 매우 멋진 마술을 지원하지만 (! 정말 멋지다) 분마다 여러 번 멈추거나 충돌합니다. 따라서 5 글자를 입력하고 2 번 입력하는 동안 2 초 또는 15 초 동안 기다려야합니다. 그리고 몇 줄의 코드가있는 프로젝트가 있었으므로 1000 줄이 들어있을 때 발생하는 것을 기다리지 않았습니다. 파일을 한 폴더에서 다른 폴더로 다트 편집기 내에서 이동하면 충돌이 발생합니다. 디버깅Dart Editor를 사용하면 내가 아는 모든 js 디버깅 도구 (크롬이 선택)보다 첫눈에 더 좋지만 여전히 누락 된 항목이 너무 많습니다. 즉시 창 없음 (현재 js 디버깅이 훨씬 우수합니다), 감시 없음.

  2. 정치와 탈출 가능성 : 어떤 사람들은 애플, MS, 파이어 폭스는 결코 다트 VM을 제공하지 않을 것이라고 말합니다. 글쎄, 확실하지는 않지만 적어도 애플에게는 이것이 매우 확실합니다. 다른 사람들에게는 반대보다 가능성이 높습니다. 문제 없습니다. Dart를 JavaScript로 변환 할 수 있습니다. 이 통합이 작동하는 방식은 정말 훌륭합니다. Dart는 js 코드를 Dart Editor에 연결 한 js 스텁을 유지하므로 Dart Editor에는 print()여전히 멋진 문구가 표시됩니다. 그러나 여기에 그러나 온다 : 그런 변환 된 코드의 풋 프린트는 높다. 150kB 정도 (최소화 전). 나는 정확한 크기를 너무 많이 파지 않았 으므로이 문제를 해결하지 마십시오.

  3. 언어 성숙 . Dart Editor가 1 분에 3 번 내 얼굴에 튀어 나오는 너무 심각한 문제 외에도, 당신이 찾은 Dart 코드에 대한 모든 소스가 다른 Dart를 사용한다는 것도 받아 들일 수 없습니다. 언어는 매일 바뀝니다. 5 주 전에 게시물을 찾았습니까? 구식입니다. Google 튜토리얼의 샘플을 사용해 보셨습니까? API가 변경되어 최소 1 개의 샘플이 컴파일되지 않습니다. 이벤트를 DOM 요소에 첨부하는 것과 같은 일상적인 일도 잘 진행되고 있습니다.

  4. 기존 js 라이브러리와의 통합은 약간 복잡합니다. 2 대의 VM은 여기에서 교묘하게 통신해야합니다.

결론적으로, 현재로서는 Dart를 심각하게 사용할 수 없으며 1과 3으로 인해 Dart로 다이빙하는 것은 그리 재미 있지 않습니다. 두 지점이 시간이 지남에 따라 사라집니다. 2 포인트에 대해 Google은 며칠 전에 성능 벤치 마크를 게시하여 컴파일 된 j가 필기 j보다 낫다는 것을 보여주었습니다. 칭찬, 잘 했어. 언급 한대로 풋 프린트 문제로 인해 로딩 시간이 여전히 늦어 질 수 있습니다. 그러나 많은 사이트에서 풋 프린트 코드가 사용되면 캐시되어 사용 가능할 수 있습니다.

따라서 저는 Dart를 훌륭한 프로젝트라고 생각합니다. 현재 프로젝트를 사용하는 것은 예측할 수없는 위험의 상당 부분을 차지하고 있으며 올해 안정적인 수준으로 유지하려면 올해가 걸릴 것입니다.

TypeScript

TypeScript를 평가하는 것은 매우 쉽고 1 ~ 2 시간이 걸리며 모든 것을 알고 있습니다. 읽기 언어 사양 문서 짧은 책 (타이프 라이터가 계시) 계시를, 나는 모든 것을 알고 프로그램을 시작했다. 그런 다음 TypeScript의 JavaScript 추가 기능이 클라이언트 프로그래밍을 향상시키는 데 필요한 모든 심각한 요구 사항을 충족한다는 사실에 놀랐습니다 . 주요 내용은 다음과 같습니다.

  1. 인터페이스 . 캡슐화 및 인터페이스를 통해 코드를 쉽게 구성 할 수 있습니다. 완전한!

  2. 수업 상태. . TypeScript를 사용하면 클래스의 인스턴스가 명시 적으로 수행되는 상태를 나타내거나 더 잘 적용 할 수 있습니다. 이것은 js 또는 커피에 비해 큰 단계입니다.

  3. this전화 매거진 완화 . 화살표 기능 안에서 TypeScript는 this포인터를 정상적으로 행동하는 시민처럼 만듭니다 .

  4. 에디터, 인텔리 . TypeScript는 C #을 프로그래밍 할 때 Visual Studio에서 사용되는 마이크로 또는 밀리 초 범위에서 반응하는 100 % 최고의 인텔리전스를 제공합니다. 모든 중요한 js 라이브러리에 대한 TypeScript 헤더 도 존재합니다 . 좋아 좋아

  5. 경험과 위험 . TypeScript를 사용하면 위험이 거의 없으며 언어가 명확하게 정의되고 완벽하게 안정적이며 설탕이 든 js이며 예측할 수 없습니다.

사실, 이러한 개선 사항은 필요한 모든 것을 제공합니다. 장래에보고 싶은 것은 일반 컬렉션입니다. 그러나 그것은 땅콩입니다.

성능은 어떻습니까? 나는 나 자신을 성능 괴물이라고 생각하지만, 성능을 기반으로 여기에서 기술을 선택할 프로젝트가 있다고 생각하지 않습니다. 둘 다 js liga에 있습니다.

웹 프로그래밍의 미래에 관심이 있고 둘 다 큰 노력을 기울이고 있습니다. TypeScript는 훨씬 실용적이고 현재 사용할 수 있습니다. Dart는 성숙한 편집자와 디버거를 사용할 수 있고 사용할 수있는 프로젝트 범위가 있으면 사용할 수있는 매우 흥미로운 실험실 프로젝트입니다. 그것은 정치에 달려 있습니다.

어쨌든 3 일 평가판은 대부분 재미 있었고 많은 것을 배웠습니다. 시간을 찾으면 Dart는 1 일, TypeScript는 2 시간이 걸립니다. 시도 해봐.

2014 년 10 월 업데이트

오래 전부터 포스트는 Typescript가 안전하고 안정적인 경로라고 가정 한 것으로 보입니다. 방금 Typescript, Dart 및 Closure에 대한 (매우) 눈에 띄는 진술을 발견했습니다.

나는 꽤 오랫동안 웹 프로그래밍의 도전에 관심이 있었다. Google Closure는 현재 대규모 JavaScript / 웹 개발에 가장 적합한 옵션이지만 궁극적으로는 덜 장황한 것으로 대체 될 것이라고 생각합니다. Dart는 상당한 가능성을 보여 주지만, 생성 된 JavaScript의 크기에 여전히 실망합니다. 비교하자면, TypeScript를 Closure Compiler의 고급 모드를 사용하여 컴파일 할 수있는 JavaScript로 직접 변환 할 수 있다면 자세한 정보없이 Closure의 최적화 된 JavaScript의 모든 이점을 얻을 수 있습니다. 또한 TypeScript는 JavaScript의 상위 세트이기 때문에 구문 확장으로 인해 어느 시점에서 ECMAScript 표준으로 만들 가능성이 있다고 생각합니다.

http://blog.bolinfest.com/2013/01/generating-google-closure-javascript.html

Michael Bolin은 오랜 시간 (예) Google (ex) fb 프론트 엔드 영웅이며 Google 폐쇄와 관련이 있습니다 (폐쇄에 대한 책을 읽으십시오).

구글 트레이서

ECMA Script 6을 오늘 구현하려는 Google의 접근 방식은 Traceur 프로젝트입니다. https://github.com/google/traceur-compiler

Typescript와 비교할 때 툴링 지원은 아마도 오늘날보다 훨씬 뒤떨어져 있습니다. 그러나 거꾸로, 반복자 또는 이해력과 같은 지나치게 멋진 미래의 js 언어 향상을 채택 하는 것이 훨씬 빠릅니다.

페이스 북 흐름, Google AtScript

TypeScript와 유사한 기능을 제공합니다.

마이크로 소프트의 조나단 터너 (Jonathan Turner)에 따르면 "이러한 자바 스크립트 유형 검사 솔루션의 기능과 그에 대한 조치가 궁금 할 것입니다.

TypeScript 팀은 Flow 및 AtScript 팀과 협력하여 JavaScript 타이핑 커뮤니티에서 이미 생성 한 리소스를 이러한 도구에서 사용할 수 있도록합니다. 이 프로젝트들은 서로 배울 수있는 것들이 많이 있으며, 우리는 앞으로 함께 일하고 JavaScript 커뮤니티를 위해 최선의 도구를 만들기를 고대하고 있습니다. 장기적으로 우리는 이러한 도구의 최고의 기능을 JavaScript의 표준 인 ECMAScript로 접을 수 있도록 노력할 것입니다. "

fb 흐름에 관한 infoq 기사


Google이 자체 프로젝트의 대부분을 다트에 사용하기 시작할 때까지 기다립니다 (해당되는 경우). 즉 개 사료를 먹기 시작합니다. 또한 Dart는 XAML 부분이없고 단 하나의 언어이지만 JS / HTML과 더 잘 통합 된 Silverlight처럼 들립니다.
Den

1
예, Dart는 실험실에서 미래에보고 기다릴 수있는 것이지만 Typescript는 현재 전문적인 개발을 준비하고 있습니다. Typescript와 Dart를 비교하는 것은 사과를 오렌지 묘목과 비교하는 것입니다.
citykid

7
이것은 매우 통찰력있는 대답이었습니다. 작성해 주셔서 감사합니다.
Darshan Sawardekar

2
클래스 속성에 액세스하기 위해 this메소드 내부에 선언 된 콜백 함수를 메소드 this컨텍스트 와 바인드해야하므로 타이프 스크립트가 컨텍스트를 어떻게 "고정"하는지 모릅니다 . 그게 어떻게 "고정"입니까?
nurettin

1
유효한 포인트. 반면 바인딩이 여전히 때때로 필요하며, 별명이 화살표의 기능을 내부에 , 그래서 문제는 적어도 완화된다.
citykid

17

인용 Scott Hanselman :

사람들은 TypeScript를 다트와 비교했습니다. 그것은 사과와 기화기를 비교하는 것입니다. TypeScript는 JavaScript를 기반으로하므로 JS interop 문제가 없습니다. 다트는 처음부터 작성된 기본 가상 머신입니다. Dart는 JavaScript와 상호 작용하지만 JS는 아닙니다. 예를 들어 JavaScript 숫자 유형도 사용하지 않습니다.

에서 왜 타이프 라이터 아무것도에 대한 해답이 될 수 있는가?


8
솔직히 조금 혼란 스러워요. TypeScript도 실제로 JS가 아닙니다. var x = {}; x.foo = 5; //Doesn't work in typescript그리고 var e = window.event ? window.event : e; //Doesn't work in typescript위의 예는 타이프 컴파일러 실패한다. 뭔가 빠졌습니까? JavaScript를 "드롭"하고 느낌이들 때 유형을 사용할 수 없습니다. 나는 새로운 구문을 배워야하고 모든 것을 타입으로 구성해야합니다.
aikeru

@aikeru 흠, 맞습니다. JS의 위대함을 없애는 것으로 보입니다. 이 새로운 도구를 사용하려고했지만 이제는 다른 생각을하고 있습니다.
Chev

3
동의하지 않는다. 사과를 배나 기화기와 연료 분사와 비교하는 것과 같습니다. 이 두 가지에 대해 많은 사람들이 자연스럽게 동시에 많은 사람들이 생각할 수있게합니다.
hippietrail

공식적으로,이 작품 var x = {}; x['foo'] = 5;이 너무 않습니다 var y:any = {}; y.foo = 5;,하지만 난 당신이 이것에 대해 말이 맞아 찾을 조금 놀랐습니다 -의 인식 유형 {}이다 {}보다는 any. 형식 유추 문제 일 수 있습니다. 여기 에 문제를 게시했습니다. 우리는 그들이 어떻게 반응하는지 볼 것입니다.
mindplay.dk

3

최근에 내 자신의 발견 으로이 토론에 참여해야했습니다.

첫번째 : TypeScript

MS는 TS 및 JS에서 쉽게 들어오고 나갈 수 있다는 점에서 훌륭한 접근 방식을 취했습니다. 우리는 주로 개발에 AngularJS를 사용하며 Angular를 TypeScript로 변환하는 데 필요한 문서는 많지 않습니다. TypeScript를 Dev 워크 플로에 통합하는 것은 멋진 추가 기능입니다.

2 위 : 다트

다트는 구글에게 약간의 아이러니 한 단계입니다. 어쩌면 그들은 액티브 X와 그날의 끔찍한 IE 5 또는 IE 6 이외의 응용 프로그램을 작동시키려는 악몽을 기억하지 못합니다. 당시부터 MS를 복구하는 데 수년이 걸렸습니다.

"개념적으로"언어 인 다트는 멋진 OOP 기능을 결합하려고 시도하는 것 같습니다. 주석 등은 Javascript에 대한 좋은 생각입니다.

문제는 새로운 편집기, 새로운 언어, 브라우저 전체의 새로운 vm, 다른 IDE 용 플러그인, 자바 스크립트로 변환하는 컴파일러 (크기가 여러 메가없이), 새로운 다트 라이브러리를 변환하거나 생성하기에 충분한 대역폭을 상상하기가 어렵습니다. 수천 개의 현재 js 라이브러리를 교체하고 누군가가 폴리머 또는 지시문을 결정하도록하고 dartlang 사이트를 다트를 사용하도록 변환하십시오. 이것이 내 머리 꼭대기에서 생각할 수있는 것입니다.

현재로서는 사소한 응용 프로그램 이외의 용도로 Dart를 사용하려는 개념은 무섭습니다.

이 ES6의 전부는 멀지 않습니다. ES6는 Dart가 ES5에있는 여러 가지 기능을 수정하려고합니다. ES6가 거리에 도달하면 가치 제안은 무엇입니까? 적어도 현재 ES6가 나오면 TypeScript에서 변경해야 할 유일한 목표는 다른 컴파일 대상을 선택하는 것입니다.

내가 프로 MS 사람이라는 것을 분명히하기 위해. MS는 훌륭한 제품을 만들고 OSS 커뮤니티에서 과거의 실수를 해결하기 위해 큰 진전을 이루었습니다. 나는 여전히 MS의 TypeScript 이외의 다른 것을 거의 사용하지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.