2017-07-11 15 views
8

Tôi đang sử dụng Microsoft TypeScript-React-Starter và đã nhận lỗi biên dịch này trong npm start:Loại phần tử JSX 'Ứng dụng' không phải là hàm tạo hàm cho các phần tử JSX. Các loại bất động sản 'setstate' không phù hợp

./src/index.tsx 
(16,5): error TS2605: JSX element type 'App' is not a constructor function for JSX elements. 
    Types of property 'setState' are incompatible. 
    Type '{ <K extends never>(f: (prevState: null, props: {}) => Pick<null, K>, callback?: (() => any) | un...' is not assignable to type '{ <K extends never>(f: (prevState: {}, props: any) => Pick<{}, K>, callback?: (() => any) | undef...'. 
     Types of parameters 'f' and 'f' are incompatible. 
     Type '(prevState: {}, props: any) => Pick<{}, any>' is not assignable to type '(prevState: null, props: {}) => Pick<null, any>'. 
      Types of parameters 'prevState' and 'prevState' are incompatible. 
      Type 'null' is not assignable to type '{}'. 

Vì vậy, nó có vẻ như chức năng setState tôi có chữ ký không chính xác nhưng tôi không chắc chắn làm thế nào để sửa chữa nó . Dưới đây là mã của tôi:

class App extends React.Component<{}, null> { 
    render() { 
    return (
     <div className="App"> 
     ... 
     </div> 
    ); 
    } 
} 

ReactDOM.render(
    <Provider store={store}> 
    <App /> 
    </Provider>, 
    document.getElementById('root') as HTMLElement 
); 

Tôi đang sử dụng:

node v6.11.0 
npm v5.1.0 
typescript v2.4.1 
react v15.6.1 
redux v3.7.1 
react-redux v5.0.5 
react-scripts-ts v2.3.2 

Cập nhật:

tôi phát hiện ra rằng việc loại bỏ các loại generic <{}, null> xóa lỗi. Nhưng tôi vẫn muốn tìm hiểu lý do tại sao tôi đã nhận được lỗi.

+0

Nếu thành phần ứng dụng không sử dụng trạng thái, bạn có thể biến nó thành một thành phần không trạng thái chức năng thay thế. –

+0

@ D-reaper 'App' sử dụng trạng thái trong trường hợp của tôi. Tôi đang sử dụng 'redux' để quản lý trạng thái. Tôi đoán đó là lý do tại sao tôi không phải viết 'prevState()' một cách rõ ràng? – CherryQu

+1

Tôi nghĩ rằng khi bạn đang chuyển 'null' làm đối số kiểu thứ hai trong React.Component, nó định nghĩa cấu trúc của trạng thái và nó chỉ tương thích với một số kiểu nhất định (ví dụ như đối tượng), khiến TS đưa ra lỗi đó. '' hoặc chỉ '<{}>' cũng sẽ hoạt động. –

Trả lời

10

TLDR; Nhà nước không thể rỗng. Khai báo một giao diện cho nó hay khai báo nó {}

trả lời nằm trong @types/react

Nhìn vào definition, không phải nhà nước cũng không đạo cụ không được dự định là null.

Khi bạn khai báo Appclass App extends React.Component<{}, null> {, về cơ bản bạn đã nói, "trạng thái là loại null".

Bây giờ, loại setState phụ thuộc vào loại bạn chỉ định cho tiểu bang và nó xung đột với lesser known version of the setState api. prevState được khai báo là {} (mặc định, vì không có giao diện nào được chỉ định) không tương thích với null, dẫn đến nhật ký lỗi bạn thấy.

+2

Vì [PR này] (https://github.com/DefinitelyTyped/DefinitelyTyped/pull/17288) đã được hợp nhất, bỏ qua các tham số kiểu sẽ khiến thành phần được tạo bằng cách sử dụng giá trị mặc định của hệ thống chống và trạng thái ('{}', ' {} '). Giả sử TS> 2.3. – Cory

+0

Chỉ cần một lưu ý rằng chúng tôi đã nhận điều này bằng cách sử dụng 'void' là tốt. Loại bỏ đối số trạng thái hoàn toàn và chỉ sử dụng đối số thuộc tính làm cho trình biên dịch hài lòng trở lại. – icfantv

Các vấn đề liên quan