javascript - Hur anger man (valfria) standardprops med TypeScript för statslösa, funktionella React-komponenter?


Jag försöker skapa en stateless React-komponent med valfria props och defaultProps i Typescript (för ett React Native-projekt). Detta är enkelt med vanlig JS, men jag är förbryllad över hur man uppnår det i TypeScript.

Med följande kod:

import React, { Component } from 'react';
import { Text } from 'react-native';

interface TestProps {
    title?: string,
    name?: string
}

const defaultProps: TestProps = {
    title: 'Mr',
    name: 'McGee'
}

const Test = (props = defaultProps) => (
    <Text>
        {props.title} {props.name}
    </Text>
);

export default Test;

Att anropa <Test title="Sir" name="Lancelot" /> visar "Sir Lancelot" som förväntat, men <Test /> ger inget, när det borde visa "Mr McGee".

All hjälp uppskattas mycket.

Svar #1

Här är en liknande fråga med ett svar: React med TypeScript - definiera defaultProps i en statslös funktion

import React, { Component } from 'react';
import { Text } from 'react-native';

interface TestProps {
    title?: string,
    name?: string
}

const defaultProps: TestProps = {
    title: 'Mr',
    name: 'McGee'
}

const Test: React.SFC<TestProps> = (props) => (
    <Text>
        {props.title} {props.name}
    </Text>
);

Test.defaultProps = defaultProps;

export default Test;

Svar #2

Jag har upptäckt att det enklaste sättet är att använda valfria argument. Observera att defaultProps så småningom kommer att tas bort på funktionella komponenter.

Exempel :

interface TestProps {
    title?: string;
    name?: string;
}

const Test = ({title = 'Mr', name = 'McGee'}: TestProps) => {
    return (
        <p>
            {title} {name}
        </p>
    );
}

Svar #3

Så här gillar jag att göra det:

type Props = { foo: Foo } & DefaultProps
type DefaultProps = Partial<typeof defaultProps>
const defaultProps = {
  title: 'Mr',
  name: 'McGee'
}

const Test = (props: Props) => {
  props = {...defaultProps, ...props}
  return (
    <Text>
      {props.title} {props.name}
    </Text>
  )
}

export default Test

Relaterade artiklar