2016-07-06 2 views
2

이것은 SSCCE입니다. 아래 코드 : strokeAsACat의 함수 호출에 불평 Flow에서인터페이스 유형으로 동적 유형 테스트를 수행하는 방법은 무엇입니까?

// @flow  
'use strict'; 

declare interface ICat { 
    purr(): string; 
} 

class Animal { 
    askToBeStrokedAsACat() { 
     strokeAsACat(this); // Flow complains here 
    } 
} 

function strokeAsACat(a: ICat) { 
    a.purr(); 
} 


class Cat extends Animal { 
    purr() { 
     return 'purr'; 
    } 
} 

const cat = new Cat(); 
cat.askToBeStrokedAsACat(); 

... 결과. 불만은 (간결 수정)된다

property `purr` of ICat not found in class Animal 

불만 합리적이고 이해된다. 인터페이스는 transpiled 때문에,

ICat. type referenced from value position 

플러스 : 대신 위의 실패 ...

class Animal { 
    askToBeStrokedAsACat() { 
     if (this instanceof ICat) 
      strokeAsACat(this); 
    } 
} 

:

dynamic type tests에 기록 된 내용에 따라 단순히 다음을 수행 할 수 있어야한다 거리가없는 경우 ICat을 런타임에 사용할 수 없으므로 다음을 실행하면 위와 같이 실행되지 않습니다.

ReferenceError: ICat is not defined 
이와 같이

는, 그 시점에서 this 핸들이 ICat -like 개체가 있음을 확인하는 유일한 방법은 다음을 수행하는 것입니다

class Animal { 
    askToBeStrokedAsACat() { 
     if (this instanceof Cat) 
      strokeAsACat(this); 
    } 
}  

...하지만이 nominal, not structural typing하고 사용의 목적을 패배

(this instanceof Cat) || (this instanceof BobCat) || (this instanceof Lynx) 

그래서 제 질문은 다음과 같습니다 : 나는 몇 가지 더 ICat-like 클래스를 추가하면 내가 나의 동적 타입 테스트를 작성해야 할 것 같은 인터페이스 ICat

  1. interface에 대한 구조 동적 유형 테스트를 수행하는 방법이 있습니까?
  2. Flow의 불만을 효과적으로 줄이기위한 다른 방법이 있습니까?

Flow 버전은 다음과 같습니다

$ npm ls --depth 0 | grep flow-bin 
├── [email protected] 

답변

1

아니, 불가능 인터페이스

에 대한 구조 동적 타입 테스트를 수행 할 수있는 방법이있다. 당신은 객체가 속성을 가지고 있고 그것이 함수인지를 테스트 할 수 있습니다.하지만 런타임에 그것의 서명을 어떻게 알 수 있습니까?

거의 필요하지 않습니다. 예를 들어, 코드에서 askToBeStrokedAsACatAnimal에 비워두고 Cat 하위 클래스로 재정의 할 수 있습니다.

+0

이것은 SSCCE입니다. 그렇기 때문에이 특별한 예에서'askToBeStrokedAsACat'을 여러분이 말한 것처럼 'Cat' "서브 클래스"에 넣을 수 있습니다.하지만 실제 사례에서는 (이 부분이 축소 된 곳에서) 코드에 필요했습니다 기본 클래스에 남아 있습니다. 더 중요한 것은 "런타임에 서명을 어떻게 알 수 있습니까?"에 대한 귀하의 추론이 옳다고 생각하지 않습니다. 모든 플로우 주석은 런타임에 사라지지만 Flow가 모든 종류의 유용한 유형 체크를 어쨌든 만드는 것을 멈추지는 않습니다. –

+0

흐름은 런타임 구성을 분석하여 코드가 안전하고 예상대로 실행됨을 증명합니다. 런타임에 무언가를 확인할 방법이없는 경우 Flow가 유추 할 방법이 없으며 현재 수행중인 작업이 안전하다는 것을 알 수 없습니다. – vkurchatkin

관련 문제