2017-02-13 2 views
11

나는 다음과 같은 상수 문자열을 말해봐흐름 상수 문자열 유형, 의존적 유형

import FOO from '../consts/Foo'

나는 그 때 기능이있다 :

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

이와 유형 체킹하지 않습니다

6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ string. Ineligible value used in/as type annotation (did you forget 'typeof'?) 
    6: const example = (foo : string) : {| type: FOO, foo: string |}=> { 
                 ^^^^^^^^^^^^^^ FOO 

그래서 제 질문은 :이 동작을 재현 할 수있는 방법

1)가, 흐름 유형의 상수를 사용할 수 있습니까?

2) 종속 형을 플로우로 처리 할 수 ​​있습니까? 예를 들어, 형식을 통해 반환되는 문자열은 example 함수에 전달되는 문자열과 동일해야합니다.

편집 : 2 부에 대한 설명 : 그것은 example 함수에 전달 된 foo 매개 변수가 실제로 반환 객체의 foo 키에서 문자열과 같은 문자열을 나타냅니다 어떤 방법으로 할 수 있습니까? 또는 입출력 길이가 같다고 주장 할 수 있습니다 (예 : 시프트 암호 기능). 또는 동일한 문자의 순열을 포함한다고 말할 수 있습니까? (셔플을 위해서).

https://en.wikipedia.org/wiki/Dependent_type

+0

만약'FOO'가''FOO'' 타입을 가지기를 원한다면, 그것을 선언해야합니다. 그렇지 않으면 그냥 문자열입니다. 객체의 경우 오류가 말하는 것처럼 'type : FOO'를 입력하면됩니다. 나는 당신이 당신의 2) 점에서 요구하고있는 것이 무엇인지 확실히 모르겠다. 그런 다음 동일한 문자열 값을 갖는 두 개의 속성이있는 객체로 끝납니다. – loganfsmyth

답변

5

대신 constFOO 선언의, 단 하나 개의 지점으로 연결이 끊긴 노조로 선언 :

type FOO = "FOO" 

그런 다음 코드는 다음과 같이 업데이트 할 수 있습니다

const example = (foo : string) : {| type: FOO, foo: string |} => { 
    return {type: "FOO", foo: foo} 
} 

정확한 문자열 리터럴 "FOO" 이외의 값을 사용하는 경우 FOO 인 경우 필요한 경우, 컴파일 오류입니다.

상수를 유지하려는 경우 유형이 충돌 할 때 유형을 다르게 지정해야합니다. 그래서 당신은 할 수 : 유형 분리 된 노동 조합의 정의 구문은 리터럴 및 유형, 그들은 상수가 아닌 경우에도 변수를 허용하기 때문에

const FOO = "FOO" 
type FooType = "FOO"; 

const example = (foo : string) : {| type: FooType, foo: string |} => { 
    return {type: FOO, foo: foo} 
} 

불행히도, 난, 문자열 리터럴 중복되지 않도록하는 방법을 볼 수 없습니다.

+0

Flux의 표준 동작 패턴에 대한 동작 유형을 문자열로 지정하여 코드에서 일부 따옴표를 지우는 것은 매우 흥미로운 패턴입니다. 이 방법은, 내가 틀렸다면 정정하고, 메타 타입을 정의 할 수 있습니다.'ValidResponses = FOO | BAR;을 호출하고 API 함수 호출이 올바른 유형의 데이터가 아니라 올바른 응답을 리턴하는지 확인하십시오. – ermik