2

구조 하위 유형 정보가 손실 될 수 있습니다흐름의 정보 손실은 이러한 종류의 다형성에 내재 된 구조적 하위 유형과 관련되어 있습니까? 흐름

type O = {x: number, y: number}; 
type P = {x: number, y: number, z: number} 

function f(o: O) { 
    return o.x * 2, o.y * 2, o; 
} 

const p: P = {x: 2, y: 3, z: 100}; 
const r = f(p); 

r.z // type error (property not found) 

(.. 그것은 눈에 보이는 돌연변이를 수행하기 때문에이 코드는, 끔찍한 그것은 단지 설명을위한 것입니다)

내가 그 행 다형성을 읽었습니다 유형 안전을 위태롭게하지 않으면 서 이러한 정보 손실을 피하기위한 개념입니다.

하위 유형 다형성으로 동일하게 달성 할 수있는 방법이 있습니까?

[편집]

내가 다소 무서운 용어에 대한 간략한 설명이 제공하는 더 많은 관객 해결하려면 다음 두 가지 유형이 동일하면 단지 멋진 단어가 결정하는 것입니다

  • Polymorpishm을 즉, 강체 형 시스템의 유연성을 향상시킵니다.
  • 파라 메트릭 다형성 (제네릭 흐름)은 항상 두 가지 유형이 동등한 유형 않기 때문에 전혀 문제가되지
  • 하위 유형 다형성 (흐름의 하위 유형)은 즉 퍼 유형
  • 행 다형성에 따라 하위 유형을 포괄, 그들로부터 계층 구조를 도출 할 수있는 경우 두 가지 유형이 동일하다는 것을 말한다은 하위 유형 지정과 유사하지만 정보 손실 문제를 해결합니다 (기술적으로 더 이상 하위 유형 관계가 없으므로 하위 유형 지정이 아닙니다)
  • 제한된 다형성은 두 가지 유형이 특정 용도 전용, 예. 평등, 순서, 매핑 오버 등등.

답변

2

내가 Flowtype에 대해 읽은 것에 대해 나는 당신의 기능이 문제라고 확신한다. 대신 이렇게하면

는 :

function f<T: O>(o: T): T { 
    o.x *= 2; 
    o.y *= 2; 
    return o; 
} 

r.z; // okay 

이는 경계 다형성의 작동합니다. 이제 T는 O의 부속 유형이라는 가정하에 본문 유형을 검사합니다. 또한 호출 사이트에서 정보가 손실되지 않습니다. Read more about it here.

또한 이전에 행 다형성에 대해 들어 보지 못했기 때문에 내가 가서 찾아 보았습니다. 그것을보고있는 동안 그 행 다형성이 이 아님을 나타내는 것 몇 가지를 읽었습니다. 하위 유형입니다. 1, 2, 3.

이 답변을 확장하고 OPs 기능이 작동하지 않지만 내가 제안한 기능이 올바르게 작동하는 이유를 명확히하기 위해. T his is a nice reference as well but is specific to Java. 으로서의 기능을 가짐으로써

:

function f(o: O) { 
    return o.x * 2, o.y * 2, o; 
} 

기능은 명시 적으로 허용되는 유형 O의 목적보다는 O의 목적 또는 O의 부속 찾는 것을 지정한다.OPs 함수에서 generic을 사용하는 대신 O를 입력하기 위해 매개 변수 o를 내 보냅니다. 이 함수 파라미터, 객체 등 관련된 방법

function f<T: O> (o: T): T { 
    o.x *= 2; 
    o.y *= 2; 
    return o; 
} 

Check out the docs on how flow handles generics하고이 처리하는 적절한 방법은 다음과 같이 수행 될 수있는 타입 O 또는 O의 서브 타입이 될 수 있음을 지정 제네릭 이용된다 .

관련 부분은 다음과 같습니다

  • "제네릭 제약 조건을 추가하는 동안 당신이 더 특정 유형에 개최 할 수 있도록 이러한 방법으로 제네릭의 종류는 역할을합니다."경계 ".

  • "제네릭은 때때로 당신이 함수에 같은 인수의 유형을 통과 할 수 있습니다. 이러한 매개 변수가 제네릭 (또는 파라 메트릭 다형성)로 알려져 있습니다. "

+0

link 왜 내 함수 문제? 그냥 퍼 유형이 예상되는 곳마다 하나의 하위 유형에 전달할 수있는 하위 유형의 약속에 의존합니다. 귀하의 조언은 한정된 다형성을 대신 사용하는 것입니다. 자, 이는 하위 유형 지정이 다른 형태의 다형성보다 열등하다는 것을 의미합니다 - 적어도 특정 경우와 복잡한 알고리즘을 구현하는 데 필요합니다. – ftor

+0

@ftor 나는 당신이 말하는 것을 이해합니다. , 그것은 작동해야하지만, 그것은 작동하는 것처럼 보입니다. 그러나 함수를 사용하면 O 유형의 매개 변수가 아니라 O 유형의 매개 변수를 명시 적으로 찾고 있음을 알게됩니다. 매개 변수가임을 지정하면O 유형 또는 O 유형 인 매개 변수를 예상한다는 것을 컴파일러에 알립니다. Java에서 처리하는 방법을 확인하십시오. https://softwareengineering.stackexchange.com/questions/227918/java-use-polymorphism-or-bounded -type-parameters – kyle

+0

@ftor 이전의 코멘트와 OOP를 설명하지만 흐름의 맥락에서 볼 때 내 업데이트 된 답변을 확인하십시오. – kyle

관련 문제