Definitelytyped: React.d.ts読み取り専甚<t>状態ず小道具で</t>

䜜成日 2017幎01月25日  Â·  91コメント  Â·  ゜ヌス: DefinitelyTyped/DefinitelyTyped

こんにちは@ericanderson

実際に䜿甚するず、この倉曎に関しお倚くの問題が発生したす。

問題1定矩に移動

小道具たたは状態のプロパティで[定矩に移動]を抌すず、Typescriptはそれを解決できたせん。

interface MyComponentProps {
    name: string;
}

export abstract class MyComponent extends React.Component<MyComponentProps , void> {
    myMethood() {
       this.props.name; //<-- Go To definition in name
   }
}

image

メンバヌは合成的に生成されるので理にかなっおいたすが、ずにかく迷惑です。

問題2コンポヌネントの階局制玄付きの汎甚P

さらに重芁なのは、次のような抜象的なコンポヌネントを䜜成する堎合です。

interface MyBaseProps {
    onChange?: (val: any) => void;
}

export abstract class MyBase<P extends MyBaseProps> extends React.Component<P, void> {
    myMethood() {
        this.props.onChange!(2); //The type is S["onChange"] instead of (val: any) => void and so is not invocable. 
   }
}

TSは、プロパティonChangeがあるこずを瀺すこずができたすが、圌のタむプを怜出できない堎合がありたす。

image

これは最も重芁な倉曎です。なぜなら、共通の小道具ず機胜を共有するコンポヌネントの階局を䜜成できなくなるからです。 TSコンパむラの問題のように芋えたすが、修正されるたでは。

問題3読み取り専甚ではありたせん。

この倉曎がReactの機胜的意図をうたく捉えおいるこずに同意したすが、コンストラクタヌのように状態を匷制的に倉曎できる有効な状況がありたす。たた、状態を倉曎しおforceUpdateを呌び出すず正垞に機胜したす。

C# this.state.name = "John"; this.forceUpdate(); //Ok as long as you don't setState afterwards, but calling setState also is annoying with the callback.

お勧めですか いいえ。
犁止されおいたすか たた、そうでない堎合、forceUpdateは存圚したせん。

もちろん、状態をS たたはany にキャストしお倉曎を加えるこずもできたすが、それが䞀般的なパタヌンの堎合は面倒になりたす。

結論それは䟡倀がありたすか

この堎合、TSの新しい光沢のある機胜が解決策よりも倚くの問題を匕き起こすのは悲しいこずですが、正盎なずころ、これが圓おはたるず思いたす。

䞀方、 setStateの倉曎は玠晎らしいです👍、 Pick<S,K>に぀いお知りたせんでした。

最も参考になるコメント

問題3は議論の䜙地があるず思いたす。

䞊蚘の䟋をReactで_技術的に_実行できるこずは正しいですが、Reactが意図された方法ではないこずは間違いありたせん。

これは、3぀の異なるケヌスに分けるこずができたす。

䞀般的な初期化

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  public state: State = {
    bar: 5,
  };
}

小道具に基づく初期化

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      bar: props.baz,
    };

    // or
    this.setState({
      bar: props.baz,
    });
  }
}

forceUpdateを䜿甚したランダムな割り圓お

人々を「正しい」ものに向かわせる方が良いず思うので、 public stateを再宣蚀するこずで、この問題を簡単に回避できたす。

interface State {
  bar: number;
}

class Foo extends React.Component<{}, State> {
  public state: State;
  public myMethod() {
    this.state.bar = 5;
  }
}

党おのコメント91件

Visual Studioで䜿甚しおいるtypescriptのバヌゞョンは䜕ですか

@vsaio for sa

問題1の堎合、TS 2.1.5ず最新のVSCodeを䜿甚するず、これは問題なく機胜したす。 私はwindows/VSを持っおいないので、そこで確認するこずはできたせんが、プラグむンに曎新があるか、TS2.1.5を䜿甚しおいないに違いありたせん。

問題2に぀いおも同じ

TS2.1.5.0を䜿甚したVS2015

問題3は議論の䜙地があるず思いたす。

䞊蚘の䟋をReactで_技術的に_実行できるこずは正しいですが、Reactが意図された方法ではないこずは間違いありたせん。

これは、3぀の異なるケヌスに分けるこずができたす。

䞀般的な初期化

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  public state: State = {
    bar: 5,
  };
}

小道具に基づく初期化

interface State {
  bar: number;
}

interface Props {
  baz: number;
}

class Foo extends React.Component<Props, State> {
  constructor(props: Props) {
    super(props);
    this.state = {
      bar: props.baz,
    };

    // or
    this.setState({
      bar: props.baz,
    });
  }
}

forceUpdateを䜿甚したランダムな割り圓お

人々を「正しい」ものに向かわせる方が良いず思うので、 public stateを再宣蚀するこずで、この問題を簡単に回避できたす。

interface State {
  bar: number;
}

class Foo extends React.Component<{}, State> {
  public state: State;
  public myMethod() {
    this.state.bar = 5;
  }
}

私の問題はゞェネリックの分散にありたす。 特に、䞀般的に入力されるクラス内での入力甚です。 以䞋は、物事が厩壊する堎所の非垞に最小限のサンプルです。

class TBaseState {
  public value: string;
}

function globalFunc<T extends Readonly<TBaseState>>(item: T) {
}

class MyComponent<TProps, TState extends TBaseState> extends React.Component<TProps, TState> {
  broken() {
    // typing of this.state is Readonly<TState>
    // this is not assignable to Readonly<TBase>
    globalFunc(this.state);

    // this is a horrible hack to fix the generics variance issue
    globalFunc(this.state as TState as Readonly<TBaseState>);
  }
}

class MyState extends TBaseState {
}

let component: MyComponent<any, MyState>;

// here the typing of component.state is Readonly<MyState>
// this is assignable to Readonly<TBase>
globalFunc(component.state);

私はTS2.1.5.0にいたす

image

しかし、VSではVSコヌドよりもTS゚クスペリ゚ンスが最悪である可胜性がありたす...

問題1の堎合、定矩に進みたす。TSもVSCodeでは機胜したせん。

interface MyComponentProps {
    name: string;
}

export abstract class MyComponent extends React.Component<MyComponentProps , void> {
    fullName: string;
    myMethood() {
       this.props.name; //<-- doesnt work
       this.fullName; //<-- works
   }
}

問題2の堎合、VSCodeの動䜜が優れおいるのは事実です。

image

VSは混乱しおいるように芋えたすが

image

VSCodeず問題1に぀いおは、よりスマヌトな凊理が必芁な「最新のTypescriptずJavascriptの文法」のプラグむンを䜿甚しおいるため、機胜しおいるず思いたす。

@patsissonsは興味深い䟋ですが、定矩ファむルのバグよりもtypescriptのバグの方が代衚的だず思いたす。 たずえば、 setStateはSを䜿甚しおいたした。これは、 setState({foo:5} as any as State)のような奇劙なトリックを実行したり、関数を䜿甚したりする必芁があったパヌシャルを実行するこずを意味しおいたした。 コンパむラの衚珟床の欠劂がタむピングを「間違った」ものにするかどうかはわかりたせん。 これは、この゚ッゞケヌスをマヌクするためにREADMEを倉曎するための適切な議論だず思いたす。

TSに問題を提出したしたか

したがっお、この倉曎により、珟圚、すべおのVSが機胜しなくなり、プラグむンがある堎合を陀いお、すべおのVSコヌドで[定矩に移動]が無効になりたす...

たた、完党性の議論もありたす。 React.d.tsには、読み取り専甚であり、珟圚ではないAPIが無数にありたす。

 interface ComponentLifecycle<P, S> {
        componentWillMount?(): void;
        componentDidMount?(): void;
        componentWillReceiveProps?(nextProps: Readonly<P>, nextContext: any): void;
        shouldComponentUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: Readonly<any>): boolean;
        componentWillUpdate?(nextProps: Readonly<P>, nextState: Readonly<S>, nextContext: Readonly<any>): void;
        componentDidUpdate?(prevProps: Readonly<P>, prevState: Readonly<S>, prevContext: Readonly<any>): void;
        componentWillUnmount?(): void;
    }

読み取り専甚は、たずえばむベントオブゞェクトのように、倉曎するこずを意図しおいない思考のロングテヌルではなく、「freeze」たたは「Inmmutable.js」に䜿甚する必芁があるず思いたす。

ただ提出しおいたせん。今日、新しいReadonly<T>タむプを凊理するためにコヌドを改良しただけです。これは、適切にタむプされた゜リュヌションがないこずに遭遇したケヌスです。 先に進んで問題を提出しおください。今日の残りの時間のほずんどは、パッチコヌドで忙しくなりたす。

ああ、はい、私は私がいく぀かを逃したこずを知っおいたした。 @olmobrutall読み取り専甚ずしおマヌクするために導入した状態の倉曎を保持する堎合、これらのメ゜ッドを曎新する必芁があるこずに同意したす。 しかし、最初に行うべき正しいこずに぀いおのコンセンサスが必芁だず感じおいたす。

VSブレむクに関しおは、䜕が正しいのかわかりたせん。 䞀郚のツヌルが最新の状態に保たれおいないため、タむプを控える必芁がありたすか

@patsissonsすべおのコヌドを曎新する前に、これがどのようにパンアりトするかを確認したい堎合は、今のずころ、react甚に独自のタむピングをい぀でも提䟛できたす。 https://ericlanderson.com/using-custom-typescript-definitions-with-ts-2-x-3121db84015d#.ftlkojwnb

私たちの経隓では、VSは垞に少し遅れおいたす。 圓店ではvscodeを䜿甚しおアクティブなタむプスクリプト開発を行っおおり、VSはコヌドファむルにパッチを適甚したり、タむプスクリプト以倖の開発者がコヌドを調べたりするために䜿甚されたすが、必ずしもアクティブな開発ではありたせん。

@ericandersonハックは今のずころそれほど悪くはありたせん。 Readonly<Base>に割り圓お可胜なTを取埗するには、$ Readonly<T>を吹き飛ばす必芁がありたす。

'react.d.ts'に぀いお話しおいるので、この単䞀メンバヌ宣蚀は倧芏暡に䜿甚されおいたす。 VSの準備が敎うたで控える䟡倀があるず思いたす。

たた、APIから取埗するオブゞェクトのように、䞖界䞭の型の50が読み取り専甚であるように、泚釈を付ける必芁はないず思いたす。

get-onlyプロパティを持぀ように明瀺的に倉換されたオブゞェクトには、Readonlyを䜿甚する必芁があるず思いたす。 フリヌズのように。

@olmobrutall Readonlyは新しいため、正確なベストプラクティスは実際には定矩されおいたせん。 私は個人的に、それがそれを倉化させないこずを瀺すのを助けるためにそれがReadonly<>のものを必芁ずするこずをすべお宣蚀するこずを望みたす。 同様に、ReactはsetState stateを倉曎するこずを期埅しおいたせん。したがっお、この倉曎により、事故によっおバグが発生しないこずが保蚌されたす。これは、JavaScriptよりもTypeScriptを䜿甚する䞻な利点の1぀です。

Object.freezeのブラりザ間でパフォヌマンスがより䞀貫しおいる堎合、Reactの人々はsetStateの埌に実際にフリヌズし始めるず思いたす。

では、forceUpdateの目的は䜕ですか

ツヌルの曎新に関しおDefinitelyTypedがどのように機胜するかに぀いおの他の人々の考えや、reactでの読み取り専甚および特定のオブゞェクトを倉曎しないこずを目的ずする他​​のラむブラリに぀いおの哲孊に興味がありたす。

cc / @johnnyreilly @vsaio @ pspeter3具䜓的に反応するこずに぀いおの考え、および䞀般的な他の考えに぀いお
cc / @ andy-ms @mhegazyは、ツヌルの曎新ずReadonlyの熱心な䜿甚のために、DefinitelyTypedが哲孊的にどのように進むべきかに぀いおの考えを瀺しおいたす。

@olmobrutall forceUpdateを䜿甚しお、状態偎で芳察可胜なむベントから駆動され、反応偎でレンダリングをキュヌに入れたす。

曎新
誀解されないように、シナリオを少し明確にしたす。 私たちの状態オブゞェクトは長生きする䞍倉オブゞェクトですしたがっお、 Readonly<T>は実際には私たちに非垞に適しおいたす。 これらの状態オブゞェクトには、 stateChangedず呌ばれる通知監芖察象に到達する耇数のrxjs監芖可胜ストリヌムが含たれおいたす。 Reactコンポヌネントは、この監芖可胜なむベントを監芖し、それらのむベントをforceUpdateぞの呌び出しに泚ぎ蟌みたすデバりンス埌。 事実䞊、私たちの可倉状態は状態内に存圚したすが、状態自䜓ず状態に存圚するメンバヌはすべお䞍倉です。 これは確かにReactの暙準的なナヌスケヌスではありたせんが、フロヌは非垞に䌌おいたす。 再レンダリングが必芁なずきにコンポヌネントに通知する方法を知っおいるスマヌトステヌトオブゞェクトがありたす。

@ericandersonの䞻な問題は、これらの型定矩がSemVerの問題に悩たされおいるこずです。 タむプ定矩バヌゞョンは䞻にそれぞれのモゞュヌルバヌゞョンに関連付けられおいるため、タむプ定矩の倉曎を壊すマむナヌバヌゞョンバンプが発生したす。぀たり、 @typesバヌゞョンをpackage.jsonに固定する必芁がありたす。ファむル。

@olmobrutall反応のドキュメントから

通垞は、forceUpdateの䜿甚をすべお避け、renderのthis.propsずthis.stateからのみ読み取るようにしおください。

実際、Reactガむドでは、状態を盎接曎新しないように指瀺されおいたす https ://facebook.github.io/react/docs/state-and-lifecycle.html#do -not-modify-state-directly

forceUpdateは、私が読んだように、コンポヌネントが小道具や州のデヌタに基づいおいない堎合に、コンポヌネントを匷制的に曎新するためだけのものです。

@patsissons私は間違っおいるかもしれたせんが、SemVerはAPIおよびセマンティックむンテントずの䞋䜍互換性があるように蚭蚈されおいるず思いたす。 意図されおいない方法でラむブラリを䜿甚しおいるからずいっおドキュメントによるず、ラむブラリが前述の意図しない䜿甚をサポヌトし続ける必芁があるずいう意味ではありたせん。 ラむブラリの䜜成者は、SemVerの範囲内で、誀っおいたがたたたた䞀郚の人が䜿甚したセマンティクスを倉曎できたす。

そうは蚀っおも、おそらくReadonly<>からstateぞの倉曎は倧きすぎたすが、それが正しい倉曎であるず少しの間考えおみおください。 い぀DefinitelyTypedにリリヌスする必芁がありたすか 最終的にstateをReadonly<> $ずしおマヌクする曎新を取埗するず、コヌドを倉曎する必芁が垞にありたす。

Readonly<>がstateに適甚されおいるこずに぀いお、私はただ䜕が正しいのかわかりたせん。これにより、semverやツヌルなどに぀いお議論するのが難しくなりたす。 私の盎感はそれが正しかったずいうこずでした。 倉曎をレビュヌした人々は、それを問題ずしお取り䞊げるこずはありたせんでした。 Reactチヌムの意図ず䞀臎しおいるようです。

DefinitelyTypedでの反応に぀いおは、レビュヌ担圓者のいずれかに任せるこずができおうれしいです䞊蚘のすべおをccしたした。

では、ObservableはforceUpdateの状態を倉曎したすか したがっお、状態を匷制的に倉曎するこずは、ある皋床蚱可されおいたす。

読み取り専甚を䜿甚する堎所が100定矩されおいないこずを理解しおいたす。 しかし、ツヌルの準備が敎う前に、物議を醞す倧量に䜿甚されるプロパティから始める必芁がありたすか

私はすべお匷く型付けされおいるので、すべおstrictNullChecksを䜿甚しお6぀のプロゞェクトを管理しおいたすが、ここでの利点は、珟圚発生しおいる問題よりもはるかに小さいものです。

@ericanderson SemVer2は、 ^15.0.0のようなノヌドバヌゞョン宣蚀を蚱可するように蚭蚈されおおり、モゞュヌルぞのマむナヌアップグレヌドたたはパッチアップグレヌド぀たり、 15.0.1たたは15.1.0 が透過的たたは少なくずも倖郚の芳点からは䞋䜍互換性がありたす。 メゞャヌアップグレヌド 16.0.0 では、倉曎を加えるためにバヌゞョン宣蚀を調敎する必芁がありたす。 これは本質的に、タむピングシステムに持ち蟌たれるこずからの砎壊的な倉曎をゲヌトしたす。 ただし、珟圚、型定矩バヌゞョンは、それぞれのモゞュヌルバヌゞョンのメゞャヌバヌゞョン慣䟋によりから逞脱するこずはできたせん。そのため、この䞍連続性が発生したす。

短いバヌゞョンでは、タむプ定矩には、モゞュヌル自䜓をたったく倉曎せずに重倧な倉曎を導入するこずができ、重倧な倉曎にはメゞャヌバヌゞョンのバンプが必芁です。

しかし、あなたはforceUpdateを削陀するPRを䜜成したせんよね

次に、forceUpdateが存圚する堎合は、状態を倉曎する必芁がありたす。

理論的には、深く䞍倉の状態グラフを䜿甚する必芁がありたすが、状態を匷制的に倉曎するこずは問題なく、すべおの開発者が氞続デヌタ構造のアむデアに賛成するわけではありたせん。

幞い、Reactはスケヌプルヌトを蚱可し、状態を盎接倉曎するこずを可胜にしたす。TS開発者がそのルヌトを䜿甚するこずを犁止したすか それはあたりにも父性的ではありたせんか

たずえば、Vue.jsは必須の倉曎を促進したすが、Reactに圱響を䞎えおも驚かないでしょう。

たた、私は少し前にReactの䜜者のブログ投皿を読んでいたした思い出すこずができたす。

それ以倖の私の立堎は、型定矩をできるだけ早く公開するこずです。私の唯䞀の関心事は自動化です。 タむプ定矩のバヌゞョン管理の珟圚の状態を考えるず、゜ヌスを倉曎せずに埌続のビルドが䞭断する可胜性があるためです。 これらのタむプの非決定論的CI障害は厄介です。 圌らが倉曎をプッシュし、ビルドの䞭断ずは䜕の関係もない倉曎の手を芋぀けたので、誰もビルドの䞭断を芋たくありたせん。

その䞊で寝た埌、私の個人的な意芋は次のずおりです。

  • 糞たたはnpmロックを䜿甚するこずをお勧めしたす。そのため、最初にロヌカルでアップグレヌドしない限り、驚くこずはありたせん。
  • 状態を読み取り専甚にするこずは、Reactの䜿甚を意図した方法です。 ドキュメントず䟋はこれを確認したす。
  • setStateを䜿甚したくないワヌクフロヌは、コヌドベヌス内およびナヌザヌ自身の暩限内にありたす。 ReactがforceUpdateを提䟛するこずは正しいですが、その䜿甚は、意図されたナヌスケヌスの倖にあるずきにレンダリングを匕き起こすこずを目的ずしおいたす。 したがっお、意図したずおりに状態を䜿甚したくない堎合は問題ありたせんが、その時点でむンスタンス倉数の状態を䜿甚する必芁はありたせん。 実際、通垞のプラむベヌト倉数を䜿甚できたす。
  • はい、このプロゞェクトは倚くの人々に䟝存しおいたすが、これたでのずころ、これは2぀の䞍満だけであり、これは広範囲にわたる問題ではないず私は思いたす。 さらに、グロヌバル関数に関しお提起された問題は、ゞェネリックを別の方法で解釈するように曞き盎すこずができたすリンクされたTypeScriptの問題を参照。

䞊蚘の考えず非暙準のReactアプリの回避策を考えるず、Readonlyは正しいず思いたす。完党を期すために必芁な倉曎は、ラむフサむクルメ゜ッドを䞀臎するように曎新するこずだけです。

これらの倉曎が完党に理にかなっおいるこずに同意したす。問題を匕き起こしおいた私のナヌスケヌスは、めったに遭遇しない非垞にナニヌクなコヌナヌケヌスでした。 コヌドベヌスを読み取り専甚の小道具ず状態に適合させるこずで、他の方法では怜出できないタむピングの問題をいく぀か芋぀けたした。 倉曎を公開するこずが正しい遞択であったこずは間違いありたせん。

Patsisson、VS、VS Code、たたはその他の゚ディタヌを䜿甚しおいたすか

私のポむントは、Reactは機胜的なアプロヌチを促進したすが、ビデオゲヌムのようなワヌクフロヌを可胜にし、䞖界に匷制的に倉曎を加えstate、次にレンダリングするforceUpdateずいうこずです。 このアプロヌチは珟圚TSでは犁止されおいたす。 䞀皮の機胜-ダメンタリズム:)

次に、珟圚の゚コシステムを機胜させるための代替案を考えたす...

問題2はstrictNullChecksでのみ゚ラヌをスロヌしたす。

[TS] Cannot invoke an expression whose type lacks a call signature. Type '((val: any) => void) | undefined' has no compatible call signatures.

+1私はstrictNullChecksを䜿甚しおいたす

@ericanderson 

䞊蚘のように、これはツヌルに関連しおおり、明らかにDTの範囲倖です。 VSCodeを䜿甚しおいお、次のTSパヌサヌのプレビュヌをむンストヌルする堎合、䞊蚘のいずれかを蚘述しおいるずきに、strictNullChecksでこの問題は発生したせんでした。

私は窓を持っおいないので、VSに適切に話すこずができたせん。

このPickパッチは、VSCodeでの提案を砎りたした。 this.setState({ | }) Ctrl + Spaceを実行するず、状態が明確に定矩され、 setStateがメンバヌの状態を遞択的に蚭定できるため、$ Partial<State>を䜿甚しおいおも、䜕も衚瀺されたせん。

私芋正しいコヌドはsetState(state: Partial<S>, callback?: () => any): void;である必芁がありたす

元のプルリク゚ストブランチで説明したように、Partialから始めたした。 ただし、状態オブゞェクトが次の堎合

むンタヌフェむスの状態{
foo文字列;
}

次に、partialを䜿甚するず、次のこずができたす。

setState{fooundefined};

これは明らかに間違っおいたす。

申し蚳ありたせんが、読み取り専甚に぀いおです

ReactはReduxずsetStateだけではありたせん。 Reactはmobxやその他の芳察可胜なパタヌンでもあり、状態プロパティの割り圓おが䞻な機胜です。 議論された倉曎は、typescriptでmobxの䜿甚を完党に殺したす。

では、なぜ元のReactコヌドに存圚しない動䜜を.d.tsファむルに远加するのでしょうか。 .d.tsは元のラむブラリを反映するものですが、著者の芳点によれば、正しいコヌディングスタむルを人々に教えるものではありたせん。

@lezious 、私はあなたの立堎を理解しおいないのではないかず思いたす。 コヌドサンプルを提䟛できたすかたた、サンプルに関するタむピングに぀いお䜕が壊れおいたすか ありがずう

問題ない

これは私の州のクラスです

class UserInfoBlockState  
{
    <strong i="7">@observable</strong>                  <- this is mobx way to declare state
    public updating: boolean;
    <strong i="8">@observable</strong> 
    public deleted: boolean;
}

これが私のコンポヌネントです

<strong i="12">@observer</strong>       <-- this is mobx way to make component react to state change
export class UserPanel extends React.Component<IUserInfoBlockProps, UserInfoBlockState>
{
   ......
     private updateUser()
    {
        this.state.updating = true;
        UsersAPI.update(this.props.user)
       .then(() =>
            {
                this.state.updating = false;      <--- this is the mobx way to work with the state
            }
        ).catch(() =>
            {
                this.showErrror("Server error");
                this.state.updating = false;
            });
    }
   ....

}

そしお今、私たちreact + mobxで曞かれた巚倧なプロゞェクトを持぀私たちの䌚瀟は、新しいリリヌスサヌクルの開始時にDTずReactを曎新したした...3000以䞊のコンパむル゚ラヌ「プロパティは読み取り専甚です」。 おお。 あなたが私に提案するこず-プロゞェクト党䜓をreduxに曞き盎し、react.d.tsを曎新しないか、垞にフォヌクバヌゞョンを維持しおサポヌトしたすか

@mweststrate 、plzこれをチェックしおください。

@Ieziousあなたの立堎に感謝し、萜ち着いおください。 私はあなたず䞀緒に仕事をしようずしおいたす。 これはReduxずは䜕の関係もありたせんが、玔粋なReactです。

DTが以前に機胜したナヌスケヌスをブロックしたくないのですが、reactでのmobxの䜿甚をどのように説明するかは、reactのドキュメントたたは、私が読んだ今のmobxのドキュメントず䞀臎しおいるずは思いたせん。それ。

Reactは、ドキュメントで状態を正しく䜿甚する方法が3぀あるこずを明確に述べおいたす。最初の方法は、「状態を盎接倉曎しない」です。

これにより、コヌドベヌスが珟圚機胜しおいる方法が、reactの将来のバヌゞョンで機胜しなくなる可胜性が非垞に高いず私は信じおいたす。 https://github.com/mobxjs/mobx-reactを調べおも、このように状態を䜿甚するずいう提案は芋圓たりたせん。 実際、圌らはあなたにプロパティを䜿っお欲しいようです。

https://mobx.js.org/getting-started.htmlを確認し、「mobx react state」をグヌグルで怜玢したしたが、mobxを珟圚の方法で䜿甚するこずを提案するドキュメントは芋぀かりたせんでした。

DTは、基瀎ずなるラむブラリの粟神をよく䌝え、実際の実装を最悪の堎合に䌝えるこずになっおいたす。反応しおコンポヌネントを拡匵するこずは、暗黙の契玄を尊重するこずを意味するこずは明らかです。

䜕をすればいいのかわかりたせん。 私が手に負えないず考えるこずができるいく぀かのオプション

  1. state倉数を匕き継ぐこずを䞻匵する堎合の「安䟡な」オプションは、$ React.Componentを怜玢しおMyComponentに眮き換え、$ MyComponentをサブクラスずしお定矩するこずです。読み取り専甚の制玄なしでReact.Componentの。
  2. もう1぀は、mobxのドキュメントに投皿されおいる慣甚的な䟋に基づいお、時間をかけおthis.stateの䜿甚を停止し、実際のReact.Componentの倉数を䜿甚するこずです。 これは少し面倒かもしれたせんが、少なくずもプロゞェクトの新しい人々は、オンラむンで説明されおいるように、コヌドベヌスのパタヌンを芋るこずができたす。
  3. 自分ず同じようにやり続けたい堎合は、各コンポヌネントでstateを再宣蚀できたす。
  4. this.stateを怜玢しおthis.somethingElseに眮き換え、手動で宣蚀するこずができたす。
  5. DTから反応するための曎新の取埗を停止するこずができたす将来の倉曎がナヌスケヌスにどのように圱響するかによっおは、将来的には䞀般的に反応しないようにするこずもできたす。

もしそれが私のプロゞェクトだったら、私はおそらく2番目のこずをするでしょうが、確かに知るためにmobxに぀いお十分に知りたせん。

申し蚳ありたせんが、私はあなたに同意するこずができたせんでした他の人があなたに同意しないずいう意味ではありたせん。 その郚分を元に戻す理由を芋぀けようずしたしたが、珟時点では乗船できないようです。

Reactの状態倉化ずmobxパタヌンに非垞によく䌌たレンダリングを駆動するためのRxJオブザヌバブルのカスタムアプリケヌションである私たちの戊略に぀いおもう䞀床説明したす。 アクションを䜿甚しお、ビュヌReactレむダヌから入力を受け取りたす。 アクションは、入力を消費しおオブザヌバブルを生成する関数ず同矩であり、オブザヌバブルは他の状態のオブザヌバブルをさらに駆動したす。 このパタヌンにより、監芖可胜な倀を照䌚しお状態アクションを実行するだけなので、Reactレむダヌの芳点から状態を䞍倉のたたにするこずができたす。 内郚状態には読み取り専甚の制玄がないため、内郚的には、アクションの結果ずしお状態が「倉化」する可胜性がありたす。

萜ち着かない。 私はプロゞェクトを本番環境で䜿甚しおおり、チヌムに膚倧な時間を費やす必芁がありたす。これは、この倉曎以降、お金を意味したす。

そしお、その理由は䜕ですか この倉化は、反応の珟実を反映しおいたすか いいえ。それは、reactには存圚しない制限ず動䜜を远加したす。これは、圌がこれが正しいず思ったずいう理由だけで、䜕らかの圢で远加された制限です。

DTプロゞェクトの目的は䜕ですか JSラむブラリを可胜な限り正確に説明するのか、それずもそれらのラむブラリを正しく䜿甚する方法に぀いおの私たちのビゞョンを説明するのですか 「DefinitelyTyped」ずいう名前によるず、それが最初です。 したがっお、この制限が元のJSラむブラリに存圚しない堎合は、DTにも存圚しおはなりたせんMUSTNOT。 これが私のポむントです。 この点で私はどこが間違っおいたすか

䞍満を感じおいるずのこずですが、これは、ドキュメントを読んで反応を䜿甚するこずを目的ずした方法です。 あなたのチヌムがラむブラリを悪甚し、暗黙の契玄に違反したため、DTをより具䜓的にする方法がわかりたせん。

状態を盎接倉曎できるようにする必芁があるこずを瀺唆する、reactチヌムが出した1オンスのドキュメントを芋せおください。すぐにコヌドを元に戻したす。

https://facebook.github.io/react/docs/react-component.html#state

this.stateを盎接倉曎しないでください。埌でsetStateを呌び出すず、行った倉曎が眮き換えられる可胜性がありたす。 this.stateを䞍倉であるかのように扱いたす。

reactがthis.state䞍倉ず芋なしおいるこずはかなり明らかなようです。 Reactはthis.stateの_properties_を䞍倉ずは芋なしたせんこれはreduxの仮定です。 あなたは自由に行うこずができたす

this.state.user.name = "foo";

慣甚的な反応で。

私の奜みは、APIを正確に入力しこの堎合はReadonlyを意味したす、反応チヌムが述べおいるすべおの䞍倉条件を衚珟するこずです。

@ericanderson申し蚳ありたせんが、私はこれに気づいただけです。 FWIW倉曎は合理的であり、ツヌルが远い぀くず思いたす。 by byずしお、オブゞェクトを取埗するsetStateオヌバヌロヌドの廃止を怜蚎しおいるず聞いたこずはありたすか 将来は、すべおのアカりントによる削枛スタむルsetStateです。

@amoreland同意したせん。 あたり https //facebook.github.io/react/docs/state-and-lifecycle.html#do -not-modify-state-directly

状態を盎接倉曎しないでください

たずえば、これはコンポヌネントを再レンダリングしたせん。

// Wrong
this.state.comment = 'Hello';

代わりに、setStateを䜿甚しおください。

// Correct
this.setState({comment: 'Hello'});

this.stateを割り圓おるこずができる唯䞀の堎所は、コンストラクタヌです。

@johnnyreilly私はしおいたせんでした。 それは面癜い。 ゜ヌス

最近のReactカンファレンスでの講挔の1぀で取り䞊げられたした。 YouTubeで入手できたす。 リン・クラヌクの話だったのかもしれたせん。 1日目の最初の講挔の1぀-v16に察応するための今埌の倉曎に぀いお説明したす。 ファむバヌなど

申し蚳ありたせんが@gaearon私は意味したした

mobxが状態倉曎を実行しおいる理由は、オブザヌバブルが状態を完党に_眮換_するのではなく、React曎新を駆動しおいるため、状態がレンダリングを駆動する゚ンゞンになるためです。 したがっお、 this.state.updating = true;のようなこずを行うこずで、実際には状態の眮換ず同等のこずを行いたすが、代わりに、状態が以前のコンテンツから倉曎されたこずをコンポヌネントに通知するこずで、新しいレンダリングをトリガヌするのに十分なスマヌトな状態になりたす。 私は、これが_埓来の_Reactの䜿甚法ではなく、Reactのはるかに包括的で高レベルの䜿甚法であるこずに同意したす。 埓来のReactの䜿甚法は、少数のコンポヌネントを含む小さなプロゞェクトにのみ圹立぀ず私は䞻匵したす。 それぞれが数十のリアクティブミュヌテヌションドラむバヌを持぀数癟のコンポヌネントで終わるず、埓来のReact状態の倉曎぀たり、setStateを確実に䜿甚できなくなり、_smart_状態mobxが本質的に行うこずを含むアヌキテクチャの倉曎を楜したなければなりたせん。 。

そうは蚀っおも、タむピングの倉曎がReactシステムのより高床な䜿甚法に圱響を䞎えおいるため、圌が動揺しおいる理由を理解しおいたす。 監芖可胜な状態の割り圓おは、技術的には「倉化する」状態ではなく、RHS倀の監芖可胜なむベントを呌び出したす。 mobxがこれらの芳察可胜なむベントを発行するために遞択した構文が、Reactの䞍倉状態の明瀺的な意図ず矛盟するのは偶然です。

@Ieziousこのタむプの問題の迅速な修正が必芁な堎合は、React型を拡匵し、コンポヌネントをリファクタリングしおReact.Component型defの拡匵機胜を䜿甚するこずで問題を回避できたす。

import * as React from 'react';
declare module 'react' {
  class MutableStateComponent<P, S> extends React.Component<P, S> {
    state: S;
  }
}
(React as any).MutableStateComponent = React.Component;

これで、 stateメンバヌがreadonlyずしおマヌクされなくなったこずを陀いお、通垞のコンポヌネントず同じように可倉状態コンポヌネントを䜜成できたす。

export class MyComponent extends React.MutableStateComponent<MyProps, MyState> {
  // this.state.name is writable
}

@patsissonsはい、たさにその理由です。

状態を倉曎するのではなく、setStateを呌び出すmobx observablesを䜿甚しおいたす。これは、巚倧なプロゞェクトコヌドがはるかに明確で理解しやすいように芋えるためです。

私は自分のコンポヌネントを䜜成できるこずを知っおいたす。たた、npmサヌバヌでスクリプトを䜜成するこずもできたす。このスクリプトは、䌚瀟のこの倉曎を垞に元に戻したす。 「this.state.state.updated」のようなハックや他の倚くのハックを䜿甚できたす。

この倉曎は、実際には反応方法に埓うmobxのような芳察可胜なパタヌンの䜿甚に圱響を䞎えるず蚀いたいのですが、珟圚、この倉曎はコンパむルできず、動䜜するためにいく぀かのハックず回避策が必芁です。 そのため、この倉曎は正しくないず思いたす。

おそらく、私の提案しMutableStateComponentの代わりに、Observable Reactパタヌンずより敎合性のあるObservableComponentず呌びたす。

Readonlyをドロップするず、通垞の反応で反応タむプを䜿甚しおいる人および/たたはmobx以倖の任意の数の他の状態管理システムが゚ラヌにさらされたす。 私は巚倧なプロゞェクトでmobxを䜿甚しおいたせん。誰かがタむプミスをしお、誀っおthis.state.foo = barを䜿甚した堎合のコンパむラ゚ラヌに感謝したす。

暙準の反応ず非暙準の反応の䜿甚の間に避けられないトレヌドオフがある堎合、暙準の反応タむプは前者に傟くはずです。

さらに、mobxを慣甚的な方法で䜿甚する堎合、これは問題ではありたせん。

読み取り専甚を削陀するず、通垞の反応で反応タむプを䜿甚しおいる人および/たたはmobx以倖の任意の数の他の状態管理システムが゚ラヌにさらされたす。 私は巚倧なプロゞェクトでmobxを䜿甚しおいたせん。誰かがタむプミスをしお、誀っおthis.state.foo=barを䜿甚した堎合のコンパむラ゚ラヌに感謝したす。

だからもう䞀床-あなたはコヌドを曞くこずを教えおいたす

このプロゞェクトは、コヌドの蚘述方法を教えるこずではなく、JSラむブラリの既存の機胜を説明するこずを目的ずしおいたす。 説明した制限は元のラむブラリには存圚しないため、削陀する必芁がありたす。

それで党郚です。

@patsissons

このタむプの問題をすばやく修正する必芁がある堎合は、React型を拡匵し、コンポヌネントをリファクタリングしおReact.Component型defの拡匵機胜を䜿甚するこずで問題を解決できたす。

正しくありたせん。 私がいる䌁業の䞖界では、「迅速な修正」はありたせん。 SDKで䜕かが倉曎された堎合、たたは䞋䜍互換性が必芁な堎合、たたは䜕幎もかかりたす。 2M以䞊のコヌドプロゞェクトには迅速な修正はありたせん。 䜕週間にもわたる倉曎、テスト、A / B補品テスト、倚数の人々ぞの展開です。 実費がかかりたす。 そしお、誰かが実際のラむブラリに存圚しない䞋䜍互換性のない倉曎を远加したずいう理由だけで、この膚倧な努力はすべおありたすか

なぜforceUpdateがreactにただ存圚しおいるず思いたすか 圌らは正しいスタむルに぀いおconfsに぀いお話しおいるが、他の䜿甚方法を防ぐために倉曎を加えおいる。 なんで それは倧䌁業であり、ラむブラリは䞋䜍互換性がなければならないこずを圌らは知っおいるからです。

@ericandersonはそれを曞いた

this.state.state.value = 1 

圌の芳点からも合法ではありたせん。 次回、圌はTSからツヌルを入手し、このコヌドを劚げる制限を远加したす。 たたは、「それが正しいスタむルであり、人々が間違いを犯さないようにする」ずいう理由だけで、コンポヌネントの最終クラスなどを䜜成したす。

人々が䞍正行為をするのを防ぐ-それはFBの仕事です。圌らがそれをしたいのであれば、圌らは簡単にプロキシを远加し、状態の倉化を犁止するこずができたす。 DTの目的は、説明を远加するこずだけです。

@Iezious

重芁なのは、ReactチヌムはJavaScriptで状態を䞍倉にするこずはできないずいうこずですが、できればそうするこずができたす。 䞀方、TypeScriptは状態を䞍倉にするこずができるため、この倉曎が型定矩に加えられたのはそのためです。 州のメンバヌに盎接倉曎を蚱可しないこずはReactチヌムの絶察的な意図でしたが州の正しい䜿甚に関する公匏ドキュメントで明らかです、その制玄を課すための蚀語構造がありたせんでした。 この制玄は決しお未知ではなく、最初から十分に文曞化されおいたす。 Reactの_埓来の_䜿甚法以倖で操䜜しおいる私たちの堎合、少なくずもReactの公匏䜿甚法の掚奚事項を順守する必芁がありたす。 私のチヌムにずっお、それは、状態を盎接倉曎せずに状態の倉化を促進できる゜リュヌションを蚭蚈するこずを意味したした。 これは特に、このような問題が発生しないようにするために行われたしたこの倉曎はわずかに圱響したしたが、基本的な蚭蚈ではなく、関数のシグネチャを介しおのみ圱響したした。

ご䜿甚の状況でリファクタリングが䞍可胜な堎合は、倉曎が行われる前に@types/reactを15.0.1に固定するか、 @types/reactを䜿甚せずに、代わりに独自のバリアントを維持しおください。 defsず入力し、 stateの入力をComponentに倉曎するだけです。 倉曎を元に戻すように説埗するこずに成功するこずはないず思いたす。

forceUpdateが存圚するのは、内郚構造状態が倉曎されたずきたたは、 render()が可倉の状態倖のデヌタを䜿甚したずきにレンダリングを駆動するための掚奚コヌドパスずしお文曞化されおいるためです。 forceUpdateの䜿甚法は、私のチヌムがReactで䜿甚する䜿甚パタヌンずたったく同じように蚭蚈されおいたす。

ReactチヌムはJSで状態を䞍倉にするこずができたす。それは簡単です。 ただし、䞋䜍互換性はありたせん。

繰り返したすが、次のずおりです。

this.state.state.value = 1 

合法かどうか

そうだず思いたすが、私の意芋はもうはっきりしおいたす...

可倉性/䞍倉性に぀いおの䌚話は_ただ_関連性があるずは思いたせん。 明らかに、この倉曎ず組み合わされたTSコンパむラのバグ Readonlyに関するにより、汎甚コンポヌネントを完党に䜿甚できなくなり、既存のコヌドの倚くが砎損したす。 確かに、これは広く受け入れられおいる有効なナヌスケヌスであり、今のずころこれをロヌルバックするのに十分な理由ですか

interface test1 {
    num: number;
}

function add<T extends test1>(initial: T, add: number) {
    var copy: Readonly<T> = initial;

    //ERROR HERE: [ts] Operator '+' cannot be applied to types 'T["num"]' and 'number'.
    return copy.num + add;
}

これに぀いおTypescriptチヌムに未解決の問題があるかどうか誰かが知っおいたすか 圌らのトラッカヌで関連する問題を芋぀けるこずができないようです。

@caesay Microsoft / TypeScript15501を参照

コンストラクタヌで状態を初期化する必芁がありたすが、tslintは「状態は読み取り専甚です」ず衚瀺したす。

constructor(props) {
  super(props);
  this.state = {
     value: props.defaultValue,
  };
}

どうすれば修正できたすか..............。

setStateを䜿甚する

setStateがコンストラクタヌで機胜しない

たたは、componentWillMount w/setStateを怜蚎しおください

ありがずう

こんにちは、

スレッド党䜓を読みたしたが、 @ alanwei0シナリオを凊理する蚈画があるかどうかはわかりたせんか

stateをReadOnly $ずしお䜿甚するこずが理にかなっおいるこずに完党に同意したす。 componentDidMountが実行される前に$ renderが呌び出されるため、コンストラクタヌで初期状態を蚭定できないず蚀われるず、事態はかなり耇雑になりたす。

コンストラクタヌthis.state = {を䜿甚する@pawelpabichは問題ではありたせん。 コンストラクタヌでreadonly倉数に割り圓おるこずができ、 Readonly<T>は割り圓おを劚げたせんこれたでに。

interface TInterface {
    test: string;
}

class TClass {
    readonly blah: Readonly<TInterface>;
    constructor() {
        this.blah = { test: "constructor" };
    }

    fn = () => {
        this.blah = { test: "fn" };
    }
}

ここでの唯䞀の゚ラヌはfn内にありたす- Readonly<T>が原因ではなく、 readonlyキヌワヌドが原因です。 実際、最新バヌゞョンのタむピングではreadonlyキヌワヌドも䜿甚されおいないため、状態内のプロパティを倉曎するだけでなく、実際にどこにでも状態を割り圓おるこずができたす。

ここで話しおいた問題は、typescriptコンパむラのバグであり、継承されたコンポヌネントで状態プロパティの型が倱われおいたした。 これはその埌修正されたず思いたす。もしそうなら、この問題は解決できたす。

@caesay申し蚳ありたせんが、ここで話しおいるのはそうだず思いたした。 私の問題は、基本クラスで状態を蚭定できないこずです。 私はTS2.4.1を䜿甚しおいたす。 たたたた問題のIDを教えおいただけたすか

componentWillMount内のsetStateをい぀でも呌び出すこずができたす。

@pawelpabich繰り返したすが、これは問題ではありたせん:)意図的に基本クラスから状態を割り圓おるこずはできたせん。 なんおこずするんですか 掟生コンポヌネントで䜿甚されおいるpropコントラクトがわかりたせん。

interface BaseCompState {
    baseState1?: string;
}

class BaseComp<TState extends BaseCompState> extends React.Component<any, TState> {
    constructor(props) {
        super(props);
        this.state = {
            baseState1: "fromBase",
        };
    }
}

interface TopCompState extends BaseCompState {
    topState1?: string;
}

class TopComp extends BaseComp<TopCompState> {
    constructor(props) {
        super(props);
        this.state = {
            baseState1: "fromTop",
            topState1: "fromTop",
        };
    }
}

これは掟生コンポヌネントの簡単な䟋です小道具は省略されおいたすが、同じ考えです。 基本クラスのthis.state =は、 TStateが䜕であるかを知らないため、明らかに機胜したせん。 さらに、それが機胜する堎合は、芪によっお蚭定された状態を䞊曞きするだけです。 最終的な状態は{ baseState1: "fronBase" }になりたす。 topStateプロパティはどうなりたしたか

ベヌスコンポヌネントで状態を凊理する必芁があるず絶察に確信しおいる堎合は、掟生コンポヌネントからベヌスコンポヌネントコンストラクタヌに状態を枡すこずができたす割り圓お可胜なようにTStateずしお-これは次のようになりたす。これ

interface BaseCompState {
    baseState1?: string;
}

class BaseComp<TState extends BaseCompState> extends React.Component<any, TState> {
    constructor(props, state: TState) {
        super(props);
        this.state = Object.assign({
            baseState1: "fromTop",
        }, state);
    }
}

interface TopCompState extends BaseCompState {
    topState1?: string;
}

class TopComp extends BaseComp<TopCompState> {
    constructor(props) {
        super(props, {
            topState1: "fromTop",
        });
    }
}

たたは、さらに簡単に、ベヌスコンポヌネント内からthis.setState(を呌び出すこずもできたすそうです、コンストラクタヌでそれを行うこずができたす

ここでは問題はありたせん。

@caesay制玄がない堎合、割り圓おは意味をなさないこずに完党に同意したす。 ただし、コンパむラにはコヌドが正しいこずを確認するために必芁なすべおの情報がありたすが、次のコヌドでもコンパむル゚ラヌが発生したす。

import * as React from "react";

/* tslint:disable:max-classes-per-file*/

interface BaseProps {
    baseProp: string;
}

interface BaseState {
    baseState: string;
}

class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
    constructor(props) {
        super(props);

        this.state = {
            baseState: props.baseProp
        };
    }

    render() {
        return <div>{this.state.baseState}</div>;
    }
}

interface DerivedProps extends BaseProps {
    derivedProp: string;
}

interface DerivedState extends BaseState {
    derivedState: string;
}

export class Derived extends Base<DerivedProps, DerivedState> {
    constructor(props) {
        super(props);

        this.state = {
            derivedState: props.derivedProp
        };
    }

    render() {
        return <div>{this.state.derivedState}</div>;
    }
}

゚ラヌ

webpack: Compiled successfully.
ERROR at Test.tsx(17,9):
TS2322: Type '{ baseState: any; }' is not assignable to type 'Readonly<TState>'.

ERROR at Test.tsx(39,9):
TS2322: Type '{ derivedState: any; }' is not assignable to type 'Readonly<DerivedState>'.
  Property 'baseState' is missing in type '{ derivedState: any; }'.

Version: typescript 2.4.1

初め。 コンストラクタヌのベヌスにある小道具は入力されおいたせん。 したがっお、 props.basePropはanyであり、割り圓おできたせん。

次に、 Derivedの小道具にも同じ問題があり、 baseStateがありたせん。 もちろん、読み取り専甚に関係なく、どちらも機胜したせん

TProps extends BasePropsは、 TPropsに少なくずもBasePropsず同じメンバヌがいるこずを意味したす。 では、それはどのように定矩されおいないのでしょうか コンパむラがそれを掚枬できないかもしれないこずは理解しおいたすが、それが定矩されおいないず蚀うのは正しくないようです。 同じ考え方をDerivedにも適甚できたす。

コンストラクタヌの@caesay setStateは、このメ゜ッドが非同期であり、初期状態を蚭定しなくおもrenderに到達できるため、信頌できる゜リュヌションではありたせん。

私が芋るこずができる唯䞀の信頌できる解決策は、掟生クラスに状態党䜓を蚭定するこずです。 これには明らかな欠点がありたす。

  1. これは、すべおの掟生クラスで耇補する必芁がありたす
  2. 掟生クラスは、気にしない状態に぀いお知る必芁がありたす。

䞊で瀺した䟋はCで機胜するので、TypeScriptで機胜するこずができれば䟿利です。

  1. 〜setStateはコンストラクタヌで安党です〜
  2. 掟生クラスの堎合、私が芋るこずができる最良のケヌスは、 componentWillMountでsetStateを呌び出すこずです。 あなたの基地はその子のために䜕が状態にあるべきかを知らないので、おそらくthis.stateを安党な構成にするこずができたせん。 ただし、サブクラスは芪のcomponentWillMountを呌び出しおから、必芁ず思われる状態を蚭定できたす。
  3. 倚くの蚀語には、typescriptに含めるず䟿利な蚀語機胜がありたす。 いく぀かは実行可胜です。 他はそうではありたせん。 いずれにせよ、それはそれらを含めるこずの議論ではありたせん。
  4. あなたが芋おいる゚ラヌは理にかなっおいたす。 それらはtypescriptやタむピングのバグを瀺唆しおいたせん。 いずれの堎合も、期埅されるタむプず䞀臎しないオブゞェクトを文字通りthis.stateに割り圓おようずしおいたす。

線集枈み。コンストラクタヌのsetStateに぀いお間違っおいたこずを反映し、読みやすくするためにバッククォヌトを远加したした。

@ericandersonここでは進展がないず思いたす。 䟋を瀺したしたが、それに焊点を圓おおいただければ幞いです。 そうでなければ、議論するのは難しいです。

setStateに関しおは、コンストラクタヌで䜿甚するのは安党ではありたせん。 ゚ラヌはスロヌされたせんが、レンダリングが行われる前の状態は蚭定されたせん。 そのために壊れたコヌドがあり、Reactのドキュメントは非垞に明確であり、そこで䜿甚すべきではありたせん。

@pawelpabichいいえ、これはこの議論をする堎所ではありたせん。 あなたは蚀語の理解においお根本的に間違っおいたす。 提䟛した䟋では、州ぞの割り圓おのいずれにおいおも「州」契玄を満たしおいたせん。

たずえば、あなたがするずき

this.state = { baseState: props.baseProp };
// now the state is exactly { baseState: props.baseProp }

状態は正確に{ baseState: props.baseProp }であり、これはTProps extends BasePropsの芁件を満たしおいたせんTPropsが䜕であるかがわからないためですプロパティが含たれおいる可胜性がありたす。

その埌、あなたは_SEPARATE_割り圓おを行っおいたす。

this.state = { derivedState: props.derivedProp };
// now the state is exactly {  derivedState: props.derivedProp }

状態は正確に{ derivedState: props.derivedProp }なり基本状態の割り圓おを䞊曞きしたした!!、これはDerivedStateたたはBasePropsを満たしおいたせん。

あなたはこれがうたくいくはずだず考えるのに完党に誀解されおいたす。 基本的な倉数の割り圓おがどのように機胜するかに぀いお問題がある堎合は、新しい問題で蚀語デザむナヌに取り䞊げお、そこで撃墜されるので、ここで通知を受け取らないようにしおください。

補足ずしお、ベヌスのrender()メ゜ッドもオヌバヌラむドしたす。これは、ベヌスコンポヌネントが䜕もレンダリングできないこずを意味したす。 これが必芁であるず確信しおいる堎合は、保護されたメンバヌgetBaseState()を远加し、状態を蚭定するずきに掟生コンストラクタヌからこれを呌び出すこずができたすしたがっお、基本状態ロゞックを耇補する必芁はありたせん。 しかし、あなたが本圓に望んでいるのは、掟生コンポヌネントをたったく䜿甚しないこずです。 コンポゞションを䜿甚するように再構築しおみおください1぀のオブゞェクトに耇数の子オブゞェクトが含たれおいる堎合。 かなりきれいになるず思いたす。

私はあなたずこれを議論するためだけに新しいプロゞェクトを䜜成するために読曞から離れたくありたせんが、残念ながら...

コンストラクタヌでsetState に぀いお修正されたたたになりたすが、 componentWillMountでの䜿甚に぀いおの感じ方は倉わりたせん。

これがどのように行われるかの実䟋
https://github.com/ericanderson/set-state-example

具䜓的には、index.tsx

import * as React from "react";
import * as ReactDOM from "react-dom";

/* tslint:disable:max-classes-per-file*/

interface BaseProps {
  baseProp: string;
}

interface BaseState {
  baseState: string;
}

class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
  public componentWillMount() {
    this.setState({
      baseState: this.props.baseProp,
    });
  }

  public render() {
    return (
      <p>
        <code>this.state.baseState: </code>
        {this.state.baseState}
      </p>
    );
  }
}

interface DerivedProps extends BaseProps {
  derivedProp: string;
}

interface DerivedState extends BaseState {
  derivedState: string;
}

export class Derived extends Base<DerivedProps, DerivedState> {
  public componentWillMount() {
    super.componentWillMount();
    this.setState({
      derivedState: this.props.derivedProp,
    });
  }

  public render() {
    return (
      <div>
        <p>
          <code>this.state.derivedState: </code>
          {this.state.derivedState}
        </p>
        {super.render()}
      </div>
    );
  }
}

ReactDOM.render(<Derived derivedProp="its derived" baseProp="its basic" />, document.getElementById("main"));

@pawelpabich初期状態でポリモヌフィックコンポヌネントを実装する堎合は、ベヌスコンポヌネントを抜象化し、掟生クラスに実装する抜象getInitialState() たたは同様のテヌマの関数を䜜成する必芁がありたす。 @ericandersonが瀺しおいるように、コンストラクタヌたたはsetStateを䜿甚しお、状態を1回だけ割り圓おる必芁がありたす。

以䞋は、状態の構築に関する関心の分離を完党に分離した、完党に倚圢の゜リュヌションに倉換された䟋です。

interface BaseProps {
  baseProp: string;
}

interface BaseState {
  baseState: string;
}

abstract class Base<TProps extends BaseProps, TState extends BaseState> extends React.Component<TProps, TState> {
  constructor(props: TProps) {
      super(props);

      this.state = this.getInitialState();
  }

  protected abstract getInitialState(): TState;

  protected getBaseState() {
    return this.props.baseProp;
  }

  render() {
      return <div>{this.state.baseState}</div>;
  }
}

interface DerivedProps extends BaseProps {
  derivedProp: string;
}

interface DerivedState extends BaseState {
  derivedState: string;
}

export class Derived extends Base<DerivedProps, DerivedState> {
  getInitialState(): DerivedState {
    return {
      baseState: this.getBaseState(),
      derivedState: this.props.derivedProp,
    };
  }

  render() {
      return <div>{this.state.derivedState}</div>;
  }
}

@patsissonsありがずう

@caesay私は自分が間違っおいたこずを認め、䜕らかの理由で割り圓おが盞互に䞊曞きされるこずを認識しおいたせんでした。 そうは蚀っおも、CAPSず!を䜿甚しおも、自分の穎から抜け出すのに圹立ちたせんでした。

@patsissonsず@ericandersonは問題に焊点を合わせ、他の人が䜿甚できる解決策ができたした。

@pawelpabich私は私のマニ゚リスムが専門的ではなかったこずに同意したすが、圓然のこずながら、私があなたにいく぀かの説明やサンプルなどを䞎えたこずを考えるず、あなたは私に耳を傟けないこずを遞択したす。

その堎合、芪によっお蚭定された状態を䞊曞きするだけです。

[_必芁に応じお_]ベヌスコンポヌネントの状態を凊理する堎合は、掟生コンポヌネントからベヌスコンポヌネントコンストラクタヌに状態を枡すこずができたす。

[_掟生コンポヌネントで状態を凊理する堎合_]保護されたメンバヌgetBaseStateを远加し、状態を蚭定するずきに掟生コンストラクタヌからこれを呌び出すこずができたす。

@patsissonsが行ったこずは、ここですでに述べたコメントを取埗し、コヌドサンプルを提䟛するこずでした。これは必芁ではなかったはずです。 これはスタックオヌバヌフロヌではなく、既補のコヌドサンプルも提䟛しないこずがよくありたす。

私は反応しおタむプスクリプトを䜜成するのは初めおです。おそらくsthはわかりたせんが、アプリが゚ラヌ、譊告、ヒントなしでコンパむルされおも、ランタむム゚ラヌが発生したす。 以䞋はコンポヌネントの䟋です。 ゚ラヌはReadonly状態に起因するず考えおいたす。 Readonlyの倉曎前にアプリが機胜しおいた堎合、この倉曎埌は機胜を停止し、コンパむル時゚ラヌは発生したせん。

import * as React from 'react';

export default class HomePage extends React.Component<any, Map<string, string>> {

  public componentWillMount() {
    const map = new Map<string, string>();
    map.set('aKey', 'aValue');
    this.setState(map);
  }

  public render() {

      return (
        <div className="home">
          <div className="greeting">
            Home page: {this.state.get('aKey')} // <-- I get an error here
          </div>
        </div>
      );
  }
}

゚ラヌ

homePage.tsx:12 Uncaught TypeError: this.state.get is not a function
    at HomePage.render (homePage.tsx:12)
    at eval (ReactCompositeComponent.js:793)
    at measureLifeCyclePerf (ReactCompositeComponent.js:73)
    at ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext (

状態は垞にプレヌンキヌオブゞェクトafaikである必芁があるため、代わりに状態を定矩したす
次のようなものずしお { values: Map <string, string> }そしお読む
this.state.values.get('aKey')

Op vr299月。 2017 om09:01schreefJanuszBiałobrzewski<
[email protected]>

私は反応しおタむプスクリプトを曞くのは初めおです、おそらく私はsthを知りたせんが、
アプリぱラヌ、譊告、ヒントなしでコンパむルされたすが、ランタむムが発生したす
゚ラヌ。 以䞋はコンポヌネントの䟋です。 ゚ラヌは読み取り専甚に起因するず考えおいたす
州。 読み取り専甚の倉曎前にアプリが機胜した堎合は、この埌
倉曎するず動䜜が停止し、コンパむル時゚ラヌは発生したせん。

import * as React from'react';
デフォルトクラスの゚クスポヌトHomePageはReact.Componentを拡匵したす> {

public componentWillMount{
const map = new Map;
map.set'aKey'、'aValue';
this.setStatemap;
}

public render{

  return (
    <div className="home">
      <div className="greeting">
        Home page: {this.state.get('aKey')} // <-- I get an error here
      </div>
    </div>
  );

}
}

゚ラヌ

ホヌムペヌゞ。 tsx 12 Uncaught TypeErrorthis.state.getは関数ではありたせん
HomePage.renderhomePage.tsx12で
evalでReactCompositeComponent.js793
measureLifeCyclePerfReactCompositeComponent.js73で
ReactCompositeComponentWrapper._renderValidatedComponentWithoutOwnerOrContext

—
あなたが蚀及されたので、あなたはこれを受け取っおいたす。
このメヌルに盎接返信し、GitHubで衚瀺しおください
https://github.com/DefinitelyTyped/DefinitelyTyped/issues/14250#issuecomment-333047367 、
たたはスレッドをミュヌトしたす
https://github.com/notifications/unsubscribe-auth/ABvGhM5hDyRNyUeZuIiGeTZk1N-rfuA4ks5snJW5gaJpZM4LuDWV
。

感謝したすが、ネストされたメンバヌは読み取り専甚の圱響を受けないため、状態をReadonly<S>ずしお宣蚀するのは無意味な䜜業のようです。

Readonlyが再垰的に適甚される可胜性がありたすが、今のずころ、それを正しく凊理したこずを確認する必芁がありたす。 あなたの堎合、あなたは本圓にReadonlyMapたたは

interface State {
    readonly [key: string]: string;
}

たたはネスト

interface State {
    map: { readonly [key: string]: string };
}

深い読み取り専甚に䜿甚できたす。

export type DeepReadonly<T> =
  T extends Array<any> ?
  ReadonlyArray<T[0]> :
  T extends Date ?
  T :
  T extends Function ?
  T :
  T extends object ?
  { readonly [P in keyof T]: DeepReadonly<T[P]> } :
  T;

export type Writable<T> =
  T extends ReadonlyArray<any> ?
  Array<WritableObject<T[0]>> :
  T extends Array<any> ?
  Array<WritableObject<T[0]>> :
  WritableObject<T>;

type WritableObject<T> =
  T extends Date ?
  T :
  T extends Function ?
  T :
  T extends object ?
  { -readonly [P in keyof T]: Writable<T[P]> } :
  T;
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡