2017-06-05 18 views
4

私はSFCの宣言の2つの方法がこれらの2つです活字体と反応を見てきました:Typescriptを持つステートレス機能コンポーネントをReactに宣言するにはどうすればよいですか?

import * as React from 'react' 

interface Props { 
    message: string 
} 

const Component = (props: Props) => { 
    const { message } = props 
    return (
    <div>{message}</div> 
) 
} 

export default Component 

と:

import * as React from 'react' 

interface Props { 
    message: string 
} 

const Component: React.StatelessComponent<Props> = props => { 
    const { message } = props 
    return (
    <div>{message}</div> 
) 
} 

export default Component 

this questionから、私は第二の方法であなたが省略できていることがわかりあなたのコンポーネントでそれを使用している場合、あなたのインターフェースの子どもたち。

これ以上の違いはありますか?どちらが好ましいのでしょうかなぜReact.StatelessComponent<T>ため

答えて

3

The definitionは次のとおりです。

(props: Props): ReactElement<any> 

(または類似した何か):スニペットComponentために

interface StatelessComponent<P> { 
    (props: P & { children?: ReactNode }, context?: any): ReactElement<any>; 
    propTypes?: ValidationMap<P>; 
    contextTypes?: ValidationMap<any>; 
    defaultProps?: Partial<P>; 
    displayName?: string; 
} 

するコンパイラによって推測されます。

あなたは、このような最初の1書く場合:

const Component = (props: Props & { children?: ReactNode }) => { 
    ... 
} 

をあなたがすることを宣言するときにはかなり(限り、あなたはコンポーネントのプロパティを使用しないよう)

+0

、私がコンポーネントのプロパティにアクセスする必要があるか、それが子供の場合は、より便利な方法がStatelessComponentを使用することであり、そうでない場合と思われますどの人が気分が良いかを決めるのは私の責任ですよね?また、もし私が間違っているなら、 'React.StatelessComponent'を使っていれば私を修正してください。戻り値の型を明示的に指定する必要はありません。 –

+0

'StatelessComponent'を自由に使うことができます。後でそのプロパティにアクセスする必要がある場合にのみ違いがあります。結果として得られるjsは、あなたが何をしているかに関係なく同じになるので、ここでは「より良い解決策」はありません。両方の場合に戻り値の型を明示的に宣言していない –

+0

Ok、入力いただきありがとうございます! :) –

2

を同じものを取得していますconst Component: React.StatelessComponent<Props> あなたは基本的にこの機能が得るものを宣言し、そして何が返されます。

interface StatelessComponent<P> { (props: P ...): ReactElement<any>;

だから読みやすくするために、私は実際にどうなる:

const Component = (props: Props): JSX.Element => {

ここで、このコードになります開発者はStatelessComponentのインタフェースが何であるかを知る必要はありませんので - 彼はちょうど何で行くと何を読み取ることができます外出。

そして基本的に、それはすべての大きさ:だから

const Component: React.StatelessComponent<Props> = (props: IProps): JSX.Element =>

+0

真実、私は戻り値の型を忘れていました。しかし、あなたの例では、次のようにはなりません: 'const Component:React.StatelessComponent = props):JSX.Element =>'、あなたはすでにStatelessComponentの小道具をインターフェイスに宣言していますか?また、 'React.StatelessComponent'を使用する場合に必要な戻り値の型ですか? –

+0

私は 'constコンポーネント:React.StatelessComponent = props)を取得しません:JSX.Element =>'質問、申し訳ありません。 2番目の質問については、必ずしも必要ではありませんが、次の開発者が 'React.StatelessComponent'宣言に入り、チェックする必要はありません。 (これらのグローバルな 'React'機能では既に知られていますが、ベストプラクティスなど)。 – alodium

+0

コンポーネントの小道具を2度再宣言しています。ここに一度 'React.StatelessComponent 'ともう一つの時間は '(props:IProps)'です。 'React.StatelessComponent'の戻り値の型として宣言されていませんか?あなたはそれを見ることができます[ここ](https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts#L219) –

関連する問題