이것은 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
interface
에 대한 구조 동적 유형 테스트를 수행하는 방법이 있습니까?- Flow의 불만을 효과적으로 줄이기위한 다른 방법이 있습니까?
내 Flow
버전은 다음과 같습니다
$ npm ls --depth 0 | grep flow-bin
├── [email protected]
이것은 SSCCE입니다. 그렇기 때문에이 특별한 예에서'askToBeStrokedAsACat'을 여러분이 말한 것처럼 'Cat' "서브 클래스"에 넣을 수 있습니다.하지만 실제 사례에서는 (이 부분이 축소 된 곳에서) 코드에 필요했습니다 기본 클래스에 남아 있습니다. 더 중요한 것은 "런타임에 서명을 어떻게 알 수 있습니까?"에 대한 귀하의 추론이 옳다고 생각하지 않습니다. 모든 플로우 주석은 런타임에 사라지지만 Flow가 모든 종류의 유용한 유형 체크를 어쨌든 만드는 것을 멈추지는 않습니다. –
흐름은 런타임 구성을 분석하여 코드가 안전하고 예상대로 실행됨을 증명합니다. 런타임에 무언가를 확인할 방법이없는 경우 Flow가 유추 할 방법이 없으며 현재 수행중인 작업이 안전하다는 것을 알 수 없습니다. – vkurchatkin