2015-12-23 3 views
2

У меня есть этот Flux магазин класс:Как получить тип общего параметра в TypScript?

'use strict'; 
import flux = require('app/tools/flux'); 
import types = require('app/tools/types'); 
import Actions = require('app/actions/actions'); 

class Store 
{ 
    bindListeners(config : any) : void {;}; 
    books : Array<types.IBook>; 
    selectedBookName : string; 

... 
} 

export = flux.createStore<Store>(Store, 'Store'); 

, который используется в этой точке зрения:

"use strict"; 
import React = require('react'); 
import Store = require('app/stores/store'); // <-- here we import the Store 
import _ = require('lodash'); 
import BookHelper = require('app/tools/bookHelper'); 
import Msg = require('app/tools/messages'); 

interface props {} 
interface state {} 

class NoteContainer extends React.Component<props, state> 
{ 
    state: typeof Store; // <-- this is Altjs<Store>, not Store :(

    render() 
    { 
     if (!this.state.selectedBookName) // <-- here's an error 
      return; 
... 

, который дает это компилирует ошибка:

error TS2339: Property 'selectedBookName' does not exist on type 'AltStore<Store>'. 

Как установить состояние зрения должно быть фактическим Магазин класс, а не AltStore<Store> класс? I.e. как я могу получить тип общего параметра, например: state: typeof Store<THIS THING>

ответ

0

Параметр состояния - это просто параметр типа для компилятора. Он не доступен вам во время выполнения, он просто там, поэтому методы типа SetState могут быть проверены типом. Однако из вашего кода вы экспортируете экземпляр магазина, а не тип Store. Поэтому вы хотите назначить это свойство state в конструкторе. Также обратите внимание, что тип состояния должен быть простым JS-объектом. React будет использовать Object.assign для объекта состояния во время выполнения, и это вызовет проблемы, если это не простой объект. Так как так:

import storeInstance = require('app/stores/store'); 

interface StateType { 
    store: AltStore<Store>; 
} 
class NoteContainer extends React.Component<PropsType, StateType> 
{ 
    constructor(props: PropsType) { 
     super(props); 
     this.state = {store: storeInstance}; 
    } 

Кроме того, обратите внимание, что вам не нужно указывать тип государственной собственности, параметры типа в определении компонентов класса заботится о том, что для вас.

Я не уверен на 100% об экспорте экземпляра из модуля, как вы здесь делаете, я не смог заставить это работать, но я не использовал импорт типа require. Если это не сработает, вам может потребоваться обернуть его в функцию, которая возвращает экземпляр и экспортирует функцию.

+0

Я не уверен, что полностью понимаю ваш ответ, но я не вижу, как это работает. В строке 4 вы по-прежнему создаете свой тип statStype AltStore, но мне нужен доступ к типу внутри, самому хранилищу. – Richard

+0

Тип хранилища на самом деле не существует во время выполнения, кроме как функция, называемая Store, когда она компилируется в JS, поэтому typeof Store просто возвращает строку «function», что не очень полезно. Если вы хотите добавить что-то вроде свойства класса в Store, вам нужно будет установить Store.prototype.someProperty = 'something' вне определения класса, а затем вы можете проверить Store.prototype.someProperty во время выполнения. – alexp