2017-04-20 9 views
1

첫 번째 약속 유형이 angular.IPromise<Foo> 인 연결 약속을 반환하는 클래스가 있고 두 번째 약속은 angular.IPromise<Bar> 유형으로 해결됩니다.연결 약속을 반환하는 함수의 유형 반환

왜 반환 유형이 doSomethingangular.IPromise<Bar>입니까?

반환 형식이 angular.IPromise<Foo> 일 것이라고 생각했을 것입니다. 그 이유는 이것이 함수에서 반환 된 첫 번째 이유이기 때문입니다. 나는 then()이 약속을 되 돌렸고 그것에 의해 반환되는 것을 감싸 줄 것이라고 알고 있습니다. 그러나 이것은 여전히 ​​저를 혼란스럽게합니다.

import { Something } from '../somewhere'; 
import { Bar } from '../somewhereelse'; 

class Test { 
    doSomething(): angular.IPromise<Bar> { 
     return Something.getFoo() // getFoo() return type angular.IPromise<Foo> 
      .then(() => { 
       let x: Bar = {};   
       return x; 
      }); 
    } 
} 

어떤 도움을 주시면 감사하겠습니다. 필요한 경우 더 많은 코드를 제공하는 것보다 기쁘게 생각합니다.

+0

는 어떻게 반환 형식이'각도 것이라고 파악 않습니다.IPromise '당신이 반환 값의 타입으로'Bar'를 선언한다면? typescript는 * runtime * 리턴 값을 알지 못한다. * 정적으로 코드를 분석한다. –

+0

반환 유형은 각도입니다. 정확도 - 쉽게 테스트 할 수 있습니다. 반환 유형이 각도가 될 것으로 기대하고있었습니다. 전달이 이므로 doSomething() 함수가 반환 한 첫 번째 것입니다. –

+2

'.then'은'.map'이'Array'에 대해서'Promise'입니다. –

답변

3

첫 번째 것은 : Something.getFoo()을 반환하지 않습니다. Something.getFoo().then(...)을 반환합니다. 약속이 비동기 작업을 실행하는 데 사용 되더라도 즉시 반환됩니다. angular.IPromise 반환 약속을 반환

then()Something.getFoo()에서 하나를 제외한 Something.getFoo().then(...)

로하고 Bar 객체를 반환 then()에 제공하는 콜백으로 반환 된 하나되지 않습니다 : promise.ten(foo=>return new Bar()) 명세서 실제로 Promise<Bar> 개체를 반환합니다.

@TsatsuyukiIshi 명시된 바와 같이,이 angular.IPromise.then의 타입 정의이다

then<X>(successCallback: (promiseValue: T) => IPromise<X>|X, ...): IPromise<X> 

이 방법은 일반적이며, 그 복귀 형 (X)는 파라미터 ((promiseValue: T) => IPromise<X>|X)로 제공되는 입력에 따라 달라진다. 당신이 Bar에 의해 X를 교체 할 경우

이 분명하다 :

then(successCallback: (promiseValue: T) => IPromise<Bar>|Bar, ...): IPromise<Bar> 
2

이 코드는 컴파일 할 때 angular.IPromise<Bar>을 반환합니다.

인터페이스는 어떤 양의 클래스에도 매핑 할 수 있으며 접두어가 I 인 접미사로 쉽게 식별 할 수 있습니다.

콘크리트 유형은 Promise 구현의 세부 사항이지만 해결시 Bar을 반환하는 한 IPromise<Bar>을 만족합니다.

편집 : TypeScript는 then<TResult>(successCallback: (promiseValue: T) => IPromise<TResult>|TResult, ...): IPromise<TResult>의 템플릿 매개 변수를 통해이를 결정합니다. 이것은 콜백의 반환 유형을 정적으로 결정합니다.

source은 참조 : 당신이 결과에서 다른 유형을 반환해야 할 경우 다음 any 유형을 사용할 수 있습니다 Whats the difference between "declare class" and "interface" in TypeScript

+0

나는 내 질문에 완전히 대답 할 지 모르겠다. 나는 "왜 반환 유형 각도 .IPromise 및 angular.IPromise "입니다 묻는 것 같아요. getFoo()에 대한 호출은 angular.IPromise 을 반환하며 이것이 doSomething()이 반환하는 첫 번째 것이므로 함수의 반환 형식이 아닌 이유는 무엇입니까? –

+0

@DaveCooper 귀하의 요청에 따라 설명을 추가했습니다. 이것이 귀하의 필요를 충족시키는 경우 답변을 수락 해 주셔서 감사합니다. –

-6

. 타이 스크립트는 100 % 강하게 타이핑 된 언어가 아닙니다. 유형은 런타임에 변경 될 수 있습니다. 실제로 해석기의 매개 변수는 무시되고 콜백은 예상대로 유형을 반환했습니다.

+6

끔찍한 충고 -1 –