2017-11-15 33 views
1

나는 Reason-React를 시험 중이다. 구성 요소 중 하나에 키를 추가하려고하면 문제가 발생합니다.언 바운드 레코드 필드 id 오류

나는 TodoItem의 목록을 상태로 취하는 TodoApp를 보유하고 있습니다. TodoItem에 대한 키가 없으면 응용 프로그램이 제대로 작동합니다. 그러나 내가 그것을 추가하면 컴파일 오류가 발생합니다. 내가 참조를 위해 여기에 파일을 추가하고 :

TodoItem.re :

type item = { 
    id: int, 
    title: string, 
    completed: bool 
}; 

let lastId = ref(0); 

let newItem =() => { 
    lastId := lastId^ + 1; 
    {id: lastId^, title: "Click a button", completed: false} 
}; 

let toString = ReasonReact.stringToElement; 

let component = ReasonReact.statelessComponent("TodoItem"); 

let make = (~item, children) => { 
    ...component, 
    render: (self) => 
    <div className="item"> 
     <input _type="checkbox" checked=(Js.Boolean.to_js_boolean(item.completed)) /> 
     (toString(item.title)) 
    </div> 
}; 

TodoApp.re :

나는 오류가 발생한 라인 근처 코멘트를 추가 한
let toString = ReasonReact.stringToElement; 

type state = {items: list(TodoItem.item)}; 

type action = 
    | AddItem; 

let component = ReasonReact.reducerComponent("TodoApp"); 

let currentItems = [TodoItem.{id: 0, title: "ToDo", completed: false}]; 

let make = (children) => { 
    ...component, 
    initialState:() => {items: currentItems}, 
    reducer: (action, {items}) => 
    switch action { 
    | AddItem => ReasonReact.Update({items: [TodoItem.newItem(), ...items]}) 
    }, 
    render: ({state: {items}, reduce}) => { 
    let numOfItems = List.length(items); 
    <div className="app"> 
     <div className="title"> 
     (toString("What to do")) 
     <button onClick=(reduce((_evt) => AddItem))> (toString("Add Something")) </button> 
     </div> 
     <div className="items"> 
     (
      ReasonReact.arrayToElement(
      Array.of_list(
       (List.map((item) => <TodoItem key=(string_of_int(item.id)) item />, items)) 
       /*List.map((item) => <TodoItem item />, items) This works but the above line of code with the key does not*/ 
      ) 
     ) 
     ) 
     </div> 
     <div className="footer"> (toString(string_of_int(numOfItems) ++ " items")) </div> 
    </div> 
    } 
}; 

.

오류는 Unbound record field id으로 읽지 만 바인딩되지 않은 방법을 알 수는 없습니다. 내가 여기서 무엇을 놓치고 있니?

답변

2

유추 유형은 레코드 필드의 사용법에 따라 다른 모듈에서 레코드 유형을 추론 할 때 다소 제한적이므로 불필요한 도움이 필요합니다. 작동해야 두 가지 옵션은 다음과 같습니다 레코드 필드가 사용되는 모듈을 열고 로컬

List.map((item: TodoItem.item) => <TodoItem key=(string_of_int(item.id)) item />) 

나 :

ìtem의 유형을 주석

List.map((item) => <TodoItem key=(string_of_int(item.TodoItem.id)) item />) 
+1

그것의 정말 타입 추론 문제가 있지만, 범위 지정 문제 (언 바운드 값 오류가 말하는 것처럼 보임). 레코드 fileds는 정의 모듈의 이름으로 정규화 된 다른 명명 된 값이므로 Module.name 구문을 사용하여 액세스해야합니다. Open 지시문은 모듈의 명명 된 값으로 현재 범위를 확장하여 모듈 이름과 점을 생략 할 수 있습니다. 여기에 명시 적으로 항목의 유형에 주석을 추가하면 범위에 TodoItem.item 유형을 추가 할 수있는 범위가 확장됩니다. – ghilesZ

+0

@ghilesZ 그건 이해가 가지만, 범위가 특정 유형으로 제한된다는 것이 이상하다고 생각합니다. – glennsl

+0

효과가 있었지만 그 이유는 알 수 없습니다. 범위 지정 문제인 경우 형식 자체를 어떻게 식별 할 수 있습니까? 유형 자체가 범위를 벗어나지 않습니까? 유형의 속성이 범위를 벗어난 것 같은가요? 그 타입이 유추되지만 명시 적으로 언급하지 않는 한 그 속성에 접근 할 수 없다는 것을 의미하는 이상한 것처럼 보입니까? – leoOrion