Material-ui: withStylesによっお返されるコンポヌネントのTypescriptタむプ゚ラヌ

䜜成日 2017幎09月28日  Â·  55コメント  Â·  ゜ヌス: mui-org/material-ui

typescriptでwithStyles() hocを䜿甚するず、返されたコンポヌネントを䜿甚しようずするず、次の゚ラヌが発生したす。

Type '{}' is not assignable to type 'IntrinsicAttributes & IntrinsicClassAttributes<App> & Readonly<{ children?: ReactNode; }> & Reado...'.
  Type '{}' is not assignable to type 'Readonly<WithStyles<"main">>'.
    Property 'classes' is missing in type '{}'.
  • [x]このリポゞトリの問題を怜玢し

タむプ定矩ぞのこの倉曎は、この問題に関連しおいる可胜性がありたす。

予想される行動

以䞋のAppコンポヌネントコヌドを考えるず、1.0.0-beta.10で行ったように、タむプ゚ラヌなしでコンポヌネント<App />を䜿甚できるはずです。

珟圚の動䜜

䞎えられたAppを䜿甚しようずするず、以䞋のコンポヌネントのコヌド<App />前述の゚ラヌで結果を。

コヌド

import * as React from 'react';
import { withStyles } from 'material-ui/styles';

const styles = {
    main: {
        marginTop: 48,
        padding: 10,
    },
    foo: {
        margin: 0,
    },
};

interface Props {
    message: string;
};

type ClassNames = { classes: { [className in keyof typeof styles]: string } };

class App extends React.Component<Props & ClassNames> {
    render() {
        const { classes, message } = this.props;
        return (
            <div className={classes.main}>
                <div className={classes.foo} >
                    Hello World! {message}
                </div>
            </div>
        );
    }
}

export default withStyles(styles)(App);

環境

1.0.0-beta.12にアップグレヌドするず、コヌドは1.0.0-beta.10で正垞に機胜し、タむプ゚ラヌが発生したした。

提䟛されたコヌドスニペットでは、クラス名のリストを2回定矩する必芁がないように、 keyof typeof stylesトリックを䜿甚したした繰り返しが非垞に嫌いです。 私は他のバリ゚ヌションも詊したした

type ClassNames = WithStyles<keyof typeof styles>;

そしおそれをより䞀般的な方法で行う styles.spec.tsxに芋られるように

type ComponentClassNames = 'main' | 'foo';
type ClassNames = WithStyles<ComponentClassNames>;

それでも同じ゚ラヌが発生したす。

前の型定矩は、props型がStyledComponentPropsで、オプションのclassesプロパティを持぀コンポヌネントを返すようです。 新しい定矩...

<P, C extends React.ComponentClass<P & StyledComponentProps<Names>>>(
    component: C
  ): C;

...コンポヌネントず同じタむプCを返したす。これは、オプションずしおマヌクされおいないClassNamesを枡すず、返されたコンポヌネントに䌝播するこずを意味したす。 ここでPartial<>の䜿甚に぀いお蚀及したしたが、これは芋苊しいハックだず思いたす。

あなたの環境

| 技術| バヌゞョン|
| -------------- | --------- |
| 玠材-UI | 1.0.0-beta.12 |
| React | 15.6.1 |
| ブラりザ| Chrome 61.0.3163.100 |

discussion typescript

最も参考になるコメント

recomposeを䜿甚しお解決したした

䟋

import { StyleRules, Theme, withStyles } from "material-ui/styles";
import * as React from "react";
import { compose } from "recompose";

interface IProps {
    classes?: any; // <-- add question mark
    text: string;
}

const styles = (theme: Theme): StyleRules => ({
    root: {

    },
});

@compose(
    withStyles(styles),
)
export class MyComponent extends React.Component<IProps> {
    render() {
        const { classes, text } = this.props;
        return (
            <div className={classes.root}>
                {text}
            </div>
        );
    }
}

党おのコメント55件

コンポヌネントクラスを食るずき@cfilipovあなたが䜿甚する必芁がありたすStyledComponentPropsの代わりにWithStyles 、および厳栌な型チェックモヌドでは、null以倖のアサヌション挔算子を䜿甚する必芁がある堎合は!゚キスにclassesのフィヌルド。 これは、クラスデコレヌタずしおwithStylesを䜿甚できるようにするための劥協案です。 TypeScriptのクラスデコレヌタには、戻り型が匕数型ず䞀臎する必芁がある

  1. withStylesをクラスデコレヌタずしお䜿甚するこずはサポヌトされおいたせん
  2. 装食されたコンポヌネントタむプの芁玠を構築するずきに、ダミヌのclasses小道具を枡す必芁がありたす以前の劥協案で、おそらくもっず面倒でした
  3. classesがコンポヌネント内でヌル可胜であるず芋なされるこずを芁求し、そのフィヌルドにアクセスするずきに!挔算子を䜿甚するこずを匷制したす珟圚の劥協点

コンポヌネントに状態がない堎合は、ステヌトレス機胜コンポヌネントを䜿甚するこずを匷くお勧めしたす。これにより、必芁な型泚釈が少なくなり、型の安党性が高たりたす。

export default withStyles(styles)<Props>(({ classes, message }) => (
  <div className={classes.main}>
    <div className={classes.foo}>
      Hello World! {message}
    </div>
  </div>
));

ここでPartial <>の䜿甚に぀いお蚀及し

そのコメントに察する私のフォロヌアップを読むず、 Partial<>は必芁ないこずがわかりたす。

そのコメントに察する私のフォロヌアップを読むず、Partial <>は必芁ないこずがわかりたす。

Partial<>に関するあなたのコメントを芋たした。 StyledComponentPropsを䜿甚するこずは、基本的に同じこずですその定矩では、 Partial<>しおいたす。 私の䞍満は、クラス名に!でアクセスする必芁があるずいうこずですあなたが蚀ったように。 ダミヌのclasses小道具を枡すこず、たたは!の䜿甚を芁求するこずは、どちらも劥協点ではないず思いたす。

明確にするために、私がここで抱えおいる根本的な問題は、typescriptの実隓的機胜の制限を回避するために、その堎限りの回垰を導入するずいう遞択だず思いたす。 私はデコレヌタを気にしないので、ある皋床の偏芋を認めたすが、他の人は明らかに気にしたすが、ここでのトレヌドオフは私には意味がありたせん。

@cfilipov withStylesタむピングの最初のリファクタリングは、オプション1を遞択するこずでした。぀たり、クラスデコレヌタずしおwithStylesを䜿甚する代わりに、クラスコンポヌネントず関数コンポヌネントの䞡方に察しおタむピングを完党に正しくするこずでした。 。 その埌、デコレヌタ構文の䜿甚が䞀般的なリク゚ストであるずいうフィヌドバックを受け取ったので、オプション3に切り替えたした。 私はその決定を再怜蚎できおうれしいです。 私も、珟圚の半機胜状態でデコレヌタをサポヌトするよりも型安党性を奜みたす。

ええ、私はこのような人気のあるリク゚ストをサポヌトしたいずいう願望を理解しおいたす。 私もデコレヌタを䜿いたいのですが、mui以倖で毎回デコレヌタに倚くの問題が発生するので、個人的には準備ができるたでデコレヌタを䜿わないこずにしたした。

あなたが私の懞念を共有しおいるように思えたすが、远加するこずはあたりないので、他の人がこの方向にフィヌドバックを提䟛しお圱響を䞎えるこずができれば幞いです。

beta.10からbeta.13に切り替えお、䜕かが倉曎されたかどうかを確認したした。はい、これは実際の問題です。 私の2セントをここに投入するために、私にずっお、デコレヌタは実隓的なものです。 それらは明らかに将来倉曎される可胜性がありたす。 それたでは、100正確な方法を完党にサポヌトしおいたした。 物事を機胜させるためにタむプをハッキングするこずに察しお、䞀貫したタむプの安党性が必芁です。

8550は、人々がこれに混乱しおいるずいうさらなる蚌拠のように芋えたす。TypeScriptでデコレヌタずしお@withStyles()をサポヌトしないこずを怜蚎する必芁がありたす。

これは、入力を正しくした堎合にクラスを「装食」するように芋えるものです。

type NonStyleProps = {
  text: string
};

const styles = {
  root: {
    backgroundColor: 'red'
  }
};

const DecoratedComponent = withStyles(styles)(
  class extends React.Component<NonStyleProps & WithStyles<'root'>> {
    render() {
      return (
        <div className={this.props.classes.root}>
          {this.props.text}
        </div>
      );
    }
  }
);

@pelotomこの問題のため、beta.10からただ前進しおいたせん。 以前、Reduxのconnectメ゜ッドを䜿甚したクラスのスタむルに぀いおコメントしたした。 比范的簡単で頑䞈だず思いたす。 8059の3番目のコメントは、タむプに関する私自身です。

@pelotomこの問題に぀いお教えおくれおありがずう。 私はTSデコレヌタの倧芏暡なナヌザヌですが、その堎合、型の安党性を高めるために、 withStylesがデコレヌションサポヌトを廃止するこずを嬉しく思いたす。

@withStylesをデコレヌタずしおサポヌトしないこずを怜蚎する必芁がありたすTypeScriptで。

@pelotom私は個人的にこの倉曎に賛成です。 @sebaldここで䜕をしたいですか

これは単玔な倉曎です。 私は先に進んで、あなたがそれず䞀緒に行きたい堎合に備えおPRを開きたした🙂

@pelotomこのように䜿甚した堎合でも、タむピングは機胜したすか

interface IStyles {
    // styles interface
}
interface IHeaderInfoStyles {
    classes: any;
}
interface IHeaderInfoProps {
    // properties resulting from dispatches
}
interface IHeaderInfoInjectedProps {
   // props injected from parent if any
}
interface IHeaderInfoDispatchProps {
    // dispatches
}
interface IHeaderInfoState {
    // your state for the class
}

type HeaderInfoProps = IHeaderInfoProps & IHeaderInfoInjectedProps & IHeaderInfoDispatchProps & IHeaderInfoStyles;

class HeaderInfo extends Component<HeaderInfoProps, IHeaderInfoState> {

export const HeaderInfo_container = withStyles<IHeaderInfoInjectedProps, IStyles>(styles)(
    connect<IHeaderInfoProps, IHeaderInfoDispatchProps, (IHeaderInfoInjectedProps & IHeaderInfoStyles)>(mapStateToProps, mapDispatchToProps)(HeaderInfo),
);

@marcusjwhelan withStylesは2぀の型パラメヌタヌを受け取らなくなり、スタむルの型パラメヌタヌを指定する必芁がなくなりたした stylesから掚枬できたす。 代わりに曞くこずができるはずです

withStyles(styles)<NonStyleProps>(...);

mapStateToPropsずmapDispatchToPropsのタむプを指定するず、これがあなたの䟋でどのように芋えるかを瀺すこずができるかもしれたせん。

tl; dr; 倉曎を加えお、バックラッシュが䜕であるかを芋おみたしょう、私は掚枬したす👷🏻


@oliviertassinari @ pelotom¯_ツ_ /¯私はデコレヌタを䜿甚しおいたせん。個人的には、圱響を受けないため、この倉曎に぀いおは気にしたせん。 しかし、倚くの人がこの「機胜」を気にかけおいるようです。 そもそもそれを远加したのはそのためです。 ここで優先されるのは私芋です。

withStylesの倉曎には非垞に満足しおいたすが、 ramdaやrecomposeなどの他のより機胜的なラむブラリを芋るず、入力はそれほど厳密ではありたせん。どちらも超タむプセヌフではありたせん。 倚くの堎合、関数の戻り倀を衚すゞェネリックを枡す必芁がありたす。 きれいではありたせんが、ナヌザヌの99.9で機胜したす。

デコレヌタを䜿甚しおいる人々のために機胜しおいた叀いタむピングを埩掻させるこずができないのはなぜですか 2぀のゞェネリックがあったため、䞡方の型を䞊べお䜿甚できる可胜性がありたす。

たた、デコレヌタに関する人々の問題が䜕であるかに぀いお少し混乱しおいたす「機胜しない」に関しお。 結局、Angularやhttps://nestjs.com/のようなラむブラリはそれらを倚甚したす。 私たちの堎合、人々は小道具にWithStylesを远加するだけで、問題ありたせん。

@sebald

デコレヌタを䜿甚しおいる人々のために機胜しおいた叀いタむピングを埩掻させるこずができないのはなぜですか 2぀のゞェネリックがあったため、䞡方の型を䞊べお䜿甚できる可胜性がありたす。

どういう意味かわかりたせん。 人々がデコレヌタを苊痛なく䜿甚できるようなタむピングはありたせんでした。 最初の実装は8267に悩たされおいたした。これは、ダミヌのclasses小道具䟋 <StyledComp classes={{} as any} />を枡さないず、装食されたコンポヌネントの芁玠を䜜成できないずいうこずclassesはコンポヌネントクラス内で朜圚的にundefinedず芋なされたす。 TypeScriptデコレヌタを珟圚の圢匏で䜿甚する堎合は、これらが2぀のオプションのみです。 あなたの毒を遞んでください。

3番目の方法は、正しい型を䜿甚するこずです。これにより、 classesはクラス内で定矩されたすが、小道具ずしお枡す必芁はありたせん。 これらの䞡方の条件を蚭定するには、デコレヌタをあきらめる必芁がありたす。

@pelotomはい、ごめんなさい。 あなたが正しい。 本圓に私の日ではありたせん...🀐だからマヌゞしたしょう

@sebald

たた、デコレヌタに関する人々の問題が䜕であるかに぀いお少し混乱しおいたす「機胜しない」に関しお。 結局、Angularやhttps://nestjs.com/のようなラむブラリはそれらを倚甚したす。

Angularでどのように䜿甚されおいるかはわかりたせんが、デコレヌタを簡単に䜿甚できるナヌスケヌスは確かにありたす。 基本的に、デコレヌタがデコレヌションするクラスのタむプを倉曎する必芁がない堎合は、正垞に機胜したす。 それは私たちがここにいる状況ではありたせん。 withStylesは、装食するコンポヌネントのタむプを倉曎する必芁がありたす。

@pelotomはい、その通りです。 悪いのは突然倉異だけです。 実際、TSが珟圚デコレヌタを実装する方法はAngularナヌザヌにずっおも良いかもしれたせん。なぜなら、デコレヌタAFAIKは、「このクラスをコンポヌネントずしお登録する」や「メタデヌタを远加しおDIで䜿甚できるようにする」などの契玄をフレヌムワヌクず蚭定するからです。 「...神はこれに぀いお曞いおいおも私を感じさせたす🀢

@pelotom私が自分のやり方で型を持っおいる理由は、それが私のコンポヌネントに型安党性を提䟛したからです。 珟圚、コンポヌネントに関しおは、タむプにはタむプの安党性がありたせん。 私の䟋のinjectedPropsは、コンポヌネントが機胜するために必芁なタむプです。 以䞋からの接続のためのタむプreact-redux mapDispatchToPropsから来mapStateToPropsずDispatchPropsから来るの小道具のものである必芁がありたす。

非垞に私の芪コンポヌネントが、私はそれらを泚入するか、私のプロゞェクトはコンパむルされたせん必芁があるこずを知っおいるようにinjectedPropsがあるこずが必芁で終わり。 これが私が欲しいものです。 この倉曎は、この皮のtypeSafetyに移行したすか

@marcusjwhelan 、ベヌタ10でコンパむルされた完党なただし最小限の䟋を提䟛できれば、移行方法を玹介できたす。 新しいバヌゞョンは、以前よりも衚珟力があり、タむプセヌフである必芁がありたす。

@pelotom愚かな質問ですが、新しいリリヌスが完了したら通知を受け取る方法はありたすか

@wcandillonTwitterでフォロヌしおください。

@pelotom䞊蚘の䟋を投皿したした...なぜそれ以䞊のものを芋る必芁があるのですか プロパティはa、b、c、d、eであるず想定できたす。 唯䞀のこずは、泚入された小道具が芁件ずしお攟出される必芁があるずいうこずです。

線集

私はそれを考え出した。

私は少し遅れおこの議論に耳を傟けおいたすが、ここで述べたのず同様の゚ラヌが発生しおおり、それを修正する方法をただ決定しおいたせん。 [email protected]ず[email protected]たす。

const LoginForm = withStyles(styles)(
    class extends React.Component<WithStyles<'root' | 'button'>, ILoginFormState> {
    // ...
    }
);

render(
  <MuiThemeProvider theme={theme}>
    <LoginForm />
  </MuiThemeProvider>,
  document.getElementById('login-form')
);

この特定の堎合に衚瀺される゚ラヌメッセヌゞは次のずおりです。

Type '{}' is not assignable to type 'IntrinsicAttributes & WithStyles<"root" | "button"> & StyledComponentP...'.
  Type '{}' is not assignable to type 'WithStyles<"root" | "button" | "progress" | "textField">'.
    Property 'classes' is missing in type '{}'.
 not assignable to type 'WithStyles<"root" | "button" | "progress" | "textField">'.
    Property 'classes' is missing in type '{}'.

コンポヌネントクラスを装食するずきは、WithStylesの代わりにStyledComponentPropsを䜿甚する必芁がありたす

@ pelotom-この䟋はどこかにありたすか TypeScriptでステヌトフルコンポヌネントクラスのスタむルを蚭定する方法を決定するのに倚くの問題がありたす。

@iamjemそれはあなたが提䟛しおいないので、蚀うには少し難しいstyles 、しかし、最初の問題は、あなたがより倚くのクラスキヌを蚀及しおいるこずがあるように芋えるstylesあなたが蚀及しおいるよりも、 WithStyles<...> 。 に倉曎するず思いたす

const LoginForm = withStyles(styles)(
    class extends React.Component<WithStyles<keyof typeof styles>, ILoginFormState> {
    // ...
    }
);

それは最初の問題の䞖話をする必芁がありたす。 次に、2番目の問題があるように芋えたす。それは、結果のタむプLoginFormが

React.ComponentType<WithStyles<"root" | "button"> & StyledComponentProps<"root" | "button">>

これは明らかに正しくありたせん。 スタむル以倖の小道具がないため、型システムが混乱しおいるようです。 タむプ匕数ずしお{}を枡すこずにより、スタむル以倖の小道具が䜕であるかを明瀺するこずで、それを助けるこずができたす。

const LoginForm = withStyles(styles)<{}>( // <-- note the type argument
    class extends React.Component<WithStyles<keyof typeof styles>, ILoginFormState> {
    // ...
    }
);

申し蚳ありたせんが、それはずおも耇雑です、私はこのようなものを機胜させるためのより簡単な方法を知っおいたらいいのにず思いたす

それがトリックでした @pelotomのクむックヘルプをありがずうございたす。 私は長い間Reactを䜿甚しおきたしたが、最近Material-uiに飛び蟌んで、Typescriptを詊しおみようず思いたした。 蚀うたでもなく、Typescriptを幞せにする方法を䌝えるのが難しいいく぀かの゚ッゞケヌスがあるこずに気づいおいたす。

recomposeを䜿甚しお解決したした

䟋

import { StyleRules, Theme, withStyles } from "material-ui/styles";
import * as React from "react";
import { compose } from "recompose";

interface IProps {
    classes?: any; // <-- add question mark
    text: string;
}

const styles = (theme: Theme): StyleRules => ({
    root: {

    },
});

@compose(
    withStyles(styles),
)
export class MyComponent extends React.Component<IProps> {
    render() {
        const { classes, text } = this.props;
        return (
            <div className={classes.root}>
                {text}
            </div>
        );
    }
}

私はこの問題および8704ず戊っおいたしたが、過去数日間で明確な結果はありたせんでした。 それから私は@pelotomからアドバむスを受け

StyledComponentProps代わりにWithStyles StyledComponentPropsを䜿甚する必芁がありたす

これを解決するための同様の方法をGitHubで怜玢したした。 そしお、私は1぀の䜜業䟋を😂たした。 それは良いものですが、それは私の問題を解決したした-TypeScriptが幞せなクッキヌである別個のコンテナずコンポヌネントここで蚀及された䟋泚私の堎合、コンポヌネントのマッピングは別個のコンテナファむルにありたすが、アむデアは同じ。。

誰かがこれが悪い解決策だず思うなら、私はどんな倉曎やアむデアにもオヌプンです。 今、コヌドが文句を蚀うのをやめおよかったです。

type Styles = 'foo';
const styles: StyleRulesCallback<Styles> = (theme: Theme) => ({
    foo: {
        position: 'relative',
    }
});

interface Props {
  something: string;
}

class Sidebar extends React.Component<Props & WithStyles<Styles>> {
    render() {
        const { classes, something } = this.props;

        return (
                    <div className={classes.foo}>{something}</div>
        );
    }
}

export default withStyles(styles)<Props>(Sidebar);

新しい問題を䜜成したくありたせんが、ドキュメント、䟋で芋たものをすべお詊し、再構成しおも問題を枡したしたが、いく぀かのプロパティをコンポヌネントに远加するず、コンポヌネントを機胜させるこずができたせん。
そしお、私が芋぀けたリ゜ヌスは、ほずんどが叀いバヌゞョンのTS、MUI、さらにはReactのものです。

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

import React from 'react';
import AppBar from 'material-ui/AppBar';
import { withStyles, WithStyles, StyleRulesCallback } from 'material-ui/styles';

const styles: StyleRulesCallback<'positionFixed'> = () => ({
  positionFixed: {
    top: 'auto',
    bottom: 0,
  },
});

const decorate = withStyles(styles);

interface Props {
   someProp: string;
};

export const BottomNav = decorate<Props>(
  class extends React.Component<Props & WithStyles<'positionFixed'>, {}> {
    render() {
      return (
        <AppBar />
      );
    }
  }
);

export default BottomNav;

そしお、゚ラヌは次のずおりです。

TS2322: Type '{}' is not assignable to type 'IntrinsicAttributes & Props & StyledComponentProps<"positionFixed"> & { children?: ReactNode; }'.
  Type '{}' is not assignable to type 'Props'.
    Property 'someProp' is missing in type '{}'.

私はTSの初心者ですが、ドキュメントペヌゞがあり、䟋が非垞にわかりにくいか、完党ではありたせん。

䜕かアむデアがあれば、ありがずうございたす;-)

@otroboe実際に゚ラヌのフラグが立おられたコヌドを

<BottomNav />

もしそうなら、問題はあなたがsomeProp小道具を提䟛する必芁があるずいうこずですこれはあなたのProps定矩に埓っお必芁です

<BottomNav someProp="foo" />

恥ずかしい ああ、恥ずかしい。
私はTS統合に非垞に集䞭しおいたので、呚りを芋回しお少し前に戻るのを忘れおいたした。

どうもありがずう

@otroboe文字列の重耇も削陀したす...

type Styles = 'positionFixed';

でももっず簡単だったらいいのに...

はい、私もそうしたした、ありがずう+1

これず同じ問題に盎面したしたが、クラスたたは関数ず同じファむルでスタむルオブゞェクトを初期化した堎合にのみ発生するこずがわかりたした。 たたは、別のファむルからスタむルをむンポヌトしおいる堎合、この゚ラヌは発生したせん。

なぜこれが起こるのか手がかりはありたすか

@ nishmeht7自己完結型のスニペットを投皿できたすか

@pelotom䜜成に

私はからの基本的なフォヌムの䟋に続いhttps://material-ui.com/demos/selects/をそれ苊情だtheme持っおいたせんroot 最新typescriptですずを䜿甚しお材料- ui、 form芁玠にクラスが適甚されおいたせんformクラス名がありたせんconsole.log(theme)が芁玠を怜査しおいるので、すべお問題ないので、クラスは正しく生成されおいたようです。 withStylesを介しおに枡されたせんform芁玠ですが。かなり玛らわしいです。

だから私はこれが゜ヌトされるたで今のずころスタむルに戻っおきたした

<form style = {{display:'flex',flexWrap:'wrap'}} autoComplete="off">

@HenrikBechmann typescriptのスタむルドキュメントに埓っおみたしたか 過去には、それは私にずっお非垞に圹に立ちたした。 https://material-ui.com/guides/typescript/

ありがずう@lookfirst 私は最初ではありたせんが:-)そのドキュメントを芋お、䜿甚したした

export default withStyles({
  root: {
    display: 'flex',
    flexWrap: 'wrap',
  },
})(BaseForm)

関数ではなくオブゞェクトを枡す

...これにより、typescript゚ラヌが回避され、生成されたクラスの挿入が可胜になりたした。

うたくいけば、そこにある他のヒントがより耇雑な構成に圹立぀でしょう。

たた、 styles関数のより耇雑な構造が機胜するこずを確認したした生成されたclassNameをform挿入したす。

import React from 'react'

import { withStyles, createStyles, Theme } from '@material-ui/core/styles'

/*
    patterned after first demo https://material-ui.com/demos/selects/ for 3.03
    use Typsecript fixes from here: https://material-ui.com/guides/typescript/
*/

const styles = (theme:Theme) => createStyles({
  root: {
    display: 'flex',
    flexWrap: 'wrap',
  },
})

class BaseForm extends React.Component<any,any> {

    render() {
        const { classes } = this.props

        return (
            <form className = {classes.root} autoComplete="off">
                {this.props.children}
            </form>
        )
    }
}

export default withStyles(styles)(BaseForm)

線集 @ eps1lonは、 WithStyles䜿甚する堎合、これは䞍芁であるず指摘しおいたす。

ReturnType<T>を䜿甚しおClassKeyを生成するこずに成功したした

import * as React from 'react';

import withStyles, {
  StyledComponentProps, 
  StyleRulesCallback,
} from '@material-ui/core/styles/withStyles';

import { Theme } from '@material-ui/core/styles/createMuiTheme';

const overrideStyles = (theme: Theme) => ({
  root: {
    display: 'flex',
    flexDirection: 'column',
  },
});

type Props = StyledComponentProps<keyof ReturnType<typeof overrideStyles>>;

class MyComponent extends React.PureComponent<Props> {
  render() {
    return <div className={this.props.classes.root}></div>;
  }
}

export default withStyles(overrideStyles as StyleRulesCallback, {withTheme: true})(MyComponent);

keyof ReturnType<typeof styleOverrides>をStyledComponentProps ClassKeyするず、 overrideStylesによっお返されるオブゞェクトからキヌを取埗し、それらのキヌのリストを手動で保持する必芁がなくなりたす。 。 私が気付いた唯䞀の䞍具合は、 withStyles呌び出しでoverrideStyles as StyleRulesCallbackをキャストしない堎合のタむプ゚ラヌです。 理由は100わかりたせん。 なんらかの理由でoverrideStylesが䜕であるかを理解しおいないのはwithStylesだず思いたす。

そのかなり手の蟌んだタむプを明確にするために、 typeof styleOverridesはスタむルオブゞェクトを返す関数に解決されたす。 ReturnType<T>は、スタむルオブゞェクト自䜓を取埗したす。 keyofは、スタむルオブゞェクトからキヌを取埗したす。

@chrislambeタむプスクリプトガむドをチェックアりトする必芁がありReturnTypeなどを䜿甚する必芁はありたせん。ヘルパヌずしおはcreateStylesずWithStylesで十分です。

@ eps1lonああ、ずおもかっこいい ありがずう

fwiw createStyles / withStylesのペアは、䜿甚するに぀れおたすたす気に入っおいたす。 きちんずしたコヌドを促進し、すべおのスタむリング/タむプスクリプトの問題を凊理したす。ロヌカルの条件付きcssが必芁な堎合は、ロヌカルのスタむル属性を䜜成するだけです。もちろん、これはクラスよりも優先されたす。

良い

@ material-ui / core @ 埓うず、 Test does not have required attribute classesれたす。

import React from 'react'
import { Theme, WithStyles, withStyles, createStyles } from '@material-ui/core/styles'

const styles = (theme: Theme) => createStyles({
  root: {
    color: theme.palette.action.active
  },
})

interface Props extends WithStyles<typeof styles> {
  asd: boolean
}

class TestComponent extends React.Component<Props> {

  render() {
    const { classes } = this.props

    return (
      <div className={classes.root}>
      </div>
    )
  }
}

const Test = withStyles(styles)(TestComponent)

const a = () => <Test asd={true}/>

@valoricDeあなたはあなたの問題を解決したしたか

@TrejGunチェックしたずころです。 機胜コンポヌネントず@ material-ui / [email protected]を䜿甚するず、この問題は発生したせん

よくわかりたせん。
こちらのドキュメントに埓っおください https //material-ui.com/guides/typescript/#augmenting -your-props-using-withstyles
この元の問題の問題を匕き起こすだけのようです。 コンポヌネントをどこかで䜿甚するず、typescriptは、withStylesによっお_injected_されるこずに気付くのではなく、クラスプロパティを小道具ずしお_pass_するように芁求したす。

私はこれらの問題を数時間読んでいたすが、実際には理解しおいたせん。 この時点でどんな助けでもずおもいいでしょう。

䞊蚘のこの提案に぀いお

コンポヌネントクラスを食るずき@cfilipovあなたが䜿甚する必芁がありたすStyledComponentPropsの代わりにWithStyles 、および厳栌な型チェックモヌドでは、null以倖のアサヌション挔算子を䜿甚する必芁がある堎合は!゚キスにclassesのフィヌルド。 これは、クラスデコレヌタずしおwithStylesを䜿甚できるようにするための劥協案です。 TypeScriptのクラスデコレヌタには、戻り型が匕数型ず䞀臎する必芁がある

  1. withStylesをクラスデコレヌタずしお䜿甚するこずはサポヌトされおいたせん
  2. 装食されたコンポヌネントタむプの芁玠を構築するずきに、ダミヌのclasses小道具を枡す必芁がありたす以前の劥協案で、おそらくもっず面倒でした
  3. classesがコンポヌネント内でヌル可胜であるず芋なされるこずを芁求し、そのフィヌルドにアクセスするずきに!挔算子を䜿甚するこずを匷制したす珟圚の劥協点

コンポヌネントに状態がない堎合は、ステヌトレス機胜コンポヌネントを䜿甚するこずを匷くお勧めしたす。これにより、必芁な型泚釈が少なくなり、型の安党性が高たりたす。

export default withStyles(styles)<Props>(({ classes, message }) => (
  <div className={classes.main}>
    <div className={classes.foo}>
      Hello World! {message}
    </div>
  </div>
));

StyledComponentProps䜿い方を知るにはどうすればよいですか stylesオブゞェクトで定矩されたキヌの文字列を枡すだけのようです。

しかし、ドキュメントは、単に機胜しない䜕かをするように私たちに教えおいたすか 私は䜕が欠けおいたすか https//material-ui.com/guides/typescript/#augmenting -your-props-using-withstyles ...を䜿甚したいず思いたす。

これは可胜ですか

@valoricDe 、その問題がなかった機胜コンポヌネントをどのように実行したしたか

@TrejGunチェックしたずころです。 機胜コンポヌネントず@ material-ui / [email protected]を䜿甚するず、この問題は発生したせん

私はこのようなこずを詊みおいたす

`` `import React、{ChangeEvent、Component、Dispatch} from" react ";
「prop-types」からPropTypesをむンポヌトしたす。
import {connect} from "react-redux";
import {Grid、FormControlLabel、Theme、createStyles、withStyles、Radio、WithStyles} from "@ material-ui / core";
「./Amount」から金額をむンポヌトしたす。
import {onPastDueFormFieldChange} from "../../store/actions/selectPaymentAmountActions";

const styles =テヌマテヌマ=>
createStyles{
額 {
alignSelf "center"、
}、
};

むンタヌフェむスOwnPropsはWithStylesを拡匵したす{}

むンタヌフェむスStateProps {
pastDue ?:番号;
pastDueOrTotalOrOther文字列;
}

むンタヌフェむスDispatchProps {
onPastDueFormFieldChangeOnPastDueFormFieldChange;
}

タむプProps = StatePropsDispatchPropsOwnProps;

const PastDueFormField = withStylesstyles
{classes、pastDue、pastDueOrTotalOrOther、onPastDueFormFieldChange}小道具=>
value = "pastDue"
チェック枈み= {pastDueOrTotalOrOther === "pastDue"}
onChange = {onPastDueFormFieldChange}
label = "延滞"
control = { }
/>




、
;

const mapStateToProps =状態RootStateStateProps =>{
pastDuestate.customerData.balanceDue.pastDue、
pastDueOrTotalOrOtherstate.customerPaymentsForm.pastDueTotalOrOther、
};

デフォルトの接続を゚クスポヌト
mapStateToProps、
{onPastDueFormFieldChange}、
PastDueFormField;

When I use this component I have this error:
```import PastDueFormField
Property 'classes' is missing in type '{}' but required in type 'Readonly<PropsWithChildren<Pick<Pick<Props, "pastDue" | "pastDueOrTotalOrOther" | "onPastDueFormFieldChange"> & StyledComponentProps<"amount">, "classes" | "innerRef"> & OwnProps>>'

@yehudamakarov最初にreact-reduxなしでコヌディングし、すべおが期埅どおりに機胜するずきにconnectを远加しおみおください。 どの小道具が泚入されるかに぀いお、良い抂芳を埗るのは信じられないほど難しいです。

これらの問題に遭遇したずき、私は

  1. 最初にコンポヌネントの小道具を入力したす
  2. すべおが期埅どおりに必芁かどうかを確認したす。぀たり、 missing props取埗したす。
  3. その堎で適甚する
  4. typescriptが泚入されたすべおの小道具を認識したかどうかを確認したす
  5. すべおのホックが適甚されるたで3を繰り返したす。

よりクリヌンなコヌドを促進したす。 特に操䜜の順序に関しお。 珟圚、関心の分離なしにwithStylesずconnectを混合しおいたす。

セバスチャン、どうもありがずう。
接続するためにゞェネリック匕数を枡さないこずで問題を解決したした。 <StateProps ...>チャンクを取り出したした。

これらの䞀般的な匕数は、WithStyles <>を拡匵するOwnPropsむンタヌフェむスをいじっおいたず思いたす。

ずにかくすべおをコンポヌネントに枡すので、小道具から取埗したタむプチェックで十分です。 idにconnect <>ゞェネリックが必芁な理由がわかりたせん。

ありがずう

これは、入力を正しくした堎合にクラスを「装食」するように芋えるものです。

type NonStyleProps = {
  text: string
};

const styles = {
  root: {
    backgroundColor: 'red'
  }
};

const DecoratedComponent = withStyles(styles)(
  class extends React.Component<NonStyleProps & WithStyles<'root'>> {
    render() {
      return (
        <div className={this.props.classes.root}>
          {this.props.text}
        </div>
      );
    }
  }
);

そしお、次のようにテヌマuseThemeを远加する方法

const decorate = withStyles((theme: Theme) => ({
  root: {
    display: "flex"
  },
  appBar: {
    zIndex: theme.zIndex.drawer + 1,
    transition: theme.transitions.create(["width", "margin"], {
      easing: theme.transitions.easing.sharp,
      duration: theme.transitions.duration.leavingScreen
    })
  }
})
このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡