2017-02-23 2 views
1

TypeScript 설명서에 설명 된대로 추가 방법을 추가하여 Promise를 보완하려고합니다. Global augmentation.새로운 Promise (...)에 대한 Promise 중단 유형 추론

그리고 시험 1에서 잘 작동하지만 약속 2. 타이프 라이터가 Promise<boolean>으로 유형을 추론을 중지하고 대신 Promise<{}>로 추론 시험에서 생성자를 사용하여 만든 몇 가지 이유가 형식 유추를 나누기. 내 기능 보강을 제거하면 생성자를 사용하여 생성 된 Promise의 제네릭 유형이 올바르게 추정됩니다.

왜 그런 일이 일어나고 그것을 어떻게 수정해야 하나?

// src/test.ts 

// augmentation 
interface Promise<T> { 
    myCustomMethod(): T; 
} 

// test 1 
let data: number = Promise.resolve(42) 
    .then((value) => value + 4) 
    .myCustomMethod(); 

// test 2 
let p2: Promise<boolean> = new Promise((resolve) => { 
    resolve(true); 
}) 

그리고 내 설정 : 내가 갖는

// tsconfig.json 
{ 
    "compilerOptions": { 
     "module": "es6", 
     "target": "es6", 
     "baseUrl": "./src" 
    } 
} 

오류입니다 : 여기

내가 할 노력하고있어의 간단한 예입니다

src/test.ts(9,5): error TS2322: Type 'Promise<{}>' is not assignable to type 'Promise<boolean>'. 
    Type '{}' is not assignable to type 'boolean'. 

UPD

그 유형은 항상 테스트 2에 대해 Promise<{}>으로 추측됩니다. 그러나 이제는 이해할 수 없습니다. 왜이 오류가 내 기능 보강없이보고되지 않습니다. Type '{}' is not assignable to type 'boolean'.부터이 기능을 사용하지 않아도 오류가 나타나지 않아야합니까?

의도적인지 또는 TypeScript 개발자에게보고해야하는지 이해하려고합니다.

답변

1

타이프 라이터를 사용하여 문제를 해결할 수 있습니다 항상 약속 < {} 심지어 당신의 증가없이이 구조에 대한> 유형을 추론 :

new Promise((resolve, reject) => { 
    resolve(true); 
}) 

오류에 의해 입증 이 과제에 대한 메시지 :

let z: void = new Promise((resolve, reject) => { 
    resolve(true); 
}) 

유형 '약속 <는 {}>'당신이 PromisemyCustomMethod(): T;를 추가 할 때

그래서, 부작용으로는 Promise<boolean>와 호환 Promise<{}>하게 '무효'를 입력하기 위해 할당 할 수없는 것입니다.

let p2: Promise<boolean> = new Promise<boolean>((resolve) => { 
    resolve(true); 
}) 
+0

덕분에 (? 당신이 해결되지 않은 약속을 myCustomMethod()를 호출 할 때, 어디 그것은 반환해야 T 값을 얻을 것이다) 당신의 약속을 구성 할 때

하나는 명시 적으로 일반적인 인수를 그렇게, 또는 사용하지 않는 당신이 대답하고 해결 방법. 업데이트 된 질문을 살펴보십시오. 내 증원없이 왜 오류가 나타나지 않는지 자세히 설명해 주시겠습니까? –

+1

가 있기 때문에 확대하지 않고,'https://www.typescriptlang.org/docs/handbook/type-compatibility.html# (T'는 함수 인수 유형으로 Promise''에 표시하고, 타이프 라이터는 [기능 호환성 규칙]을 가지고 '(boolean)'이'{} '에 할당 될 수 있기 때문에'function (x : {})'를'function (x : boolean)'과 호환 가능하게 만드는 함수 인자 - 변수 쌍성. 반환 값으로'T'를 쓰면'{}'를'boolean'에 할당 할 수 없으므로 호환되지 않습니다. – artem

+1

여기 (https://www.typescriptlang.org/play/#src=var%20f1%20%3D%20function%20 (X % 3A % 20boolean) % 3A % 20void이 [함수 타입 호환성을 보여주는 예]는 % 20 % 3B %의 0D % 0Avar % 20f2 % 20 % 3 차원 % 20function 20 % (X %의 3A의 % 20 %도 7B %의 7D) % 3A % 20void % 20 %도 7B % 20 % 7D %의 3B % 7B % 20 % 7D %의 0D %의 0Af1 % 20 % 3 차원 %의 20f2 %의 3B % 20 % 2F % 2F % 20ok % 0D % 0Af2 % ​​20 % 3 차원 %의 20f1 % 3B % 20 % 2F % 2F % 20ok % 0D % 0A가 된 %의 0D % 0Avar % 20f3 % 20 %의 3D % 20function 20 %() % 3A % 20boolean % 20 %도 7B % 20return % 20true % 7D %의 3B %의 0D % 0Avar % 20f4 % 20 % 3 차원 % 20function 20 %() %의 3A % 20 %도 7B %의 7D %의 20 % 7B % 20 % 20 % 3 % 20 % 3 % 20 % 3 % 20 % 3 % 20 % 3 % 20 % 3 % 20 % 20 % 2F % 2F % 20ok % 0D % 0A) – artem

2

컴파일러는 Promise.resolve(42)에 상수를 사용하여 Promise.resolve()을 호출하는 것과 같이 간단한 경우 인수의 제네릭 유형을 유추 할 수 있습니다. resolve(true)으로 전화를 걸 때 유형이 분명 해지면 더 복잡한 상황에서는 그렇지 못할 수도 있습니다.

은에 설명되어있는 TypeScript Handbook :

유형 인수 추론은 코드가 짧고 읽기 쉽게 유지하는 유용한 도구가 될 수 있지만, 당신은 우리가 이전에했던 것처럼 명시 적으로 형식 인수를 전달해야 할 수도 있습니다 더 복잡한 예제 에서처럼 컴파일러가 유형을 추론하지 못하는 경우를 예로들 수 있습니다.

당신은

let p2: Promise<boolean> = new Promise<boolean>(resolve => { 
    resolve(true); 
});