อุปกรณ์ประกอบฉากเริ่มต้นที่มีองค์ประกอบของคลาส
การใช้static defaultProps
ถูกต้อง คุณควรใช้อินเตอร์เฟสไม่ใช่คลาสสำหรับอุปกรณ์ประกอบฉากและสถานะ
อัปเดต 2018/12/1 : TypeScript ได้ปรับปรุงการตรวจสอบประเภทที่เกี่ยวข้องกับdefaultProps
ช่วงเวลาหนึ่ง อ่านเพื่อการใช้งานล่าสุดและยิ่งใหญ่ที่สุดจนถึงประเพณีและปัญหาที่เก่ากว่า
สำหรับ TypeScript 3.0 ขึ้นไป
TypeScript เพิ่มการสนับสนุนเป็นพิเศษสำหรับdefaultProps
การตรวจสอบประเภทงานตามที่คุณต้องการ ตัวอย่าง:
interface PageProps {
foo: string;
bar: string;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, { this.props.foo.toUpperCase() }</span>
);
}
}
ซึ่งสามารถเรนเดอร์และคอมไพล์ได้โดยไม่ต้องผ่านแอfoo
ททริบิวต์:
<PageComponent bar={ "hello" } />
โปรดทราบว่า:
foo
จะไม่ได้ทำเครื่องหมายตัวเลือก (เช่นfoo?: string
) แม้ว่ามันจะไม่จำเป็นต้องเป็นแอตทริบิวต์ JSX การทำเครื่องหมายเป็นตัวเลือกอาจหมายถึงว่าเป็นไปได้undefined
แต่ในความเป็นจริงมันไม่เคยเป็นundefined
เพราะdefaultProps
ให้ค่าเริ่มต้น คิดว่ามันคล้ายกับวิธีการที่คุณสามารถทำเครื่องหมายพารามิเตอร์ตัวฟังก์ชั่นหรือค่าเริ่มต้น แต่ไม่ได้ทั้งสองทั้งยังหมายถึงการเรียกร้องไม่จำเป็นต้องระบุค่า TypeScript 3.0+ ปฏิบัติdefaultProps
ในลักษณะเดียวกันซึ่งยอดเยี่ยมมากสำหรับผู้ใช้ React!
defaultProps
ไม่มีประเภทคำอธิบายประกอบอย่างชัดเจน ประเภทของมันถูกอนุมานและใช้งานโดยคอมไพเลอร์เพื่อกำหนดแอตทริบิวต์ JSX ที่จำเป็น คุณสามารถใช้defaultProps: Pick<PageProps, "foo">
เพื่อให้แน่ใจว่าการแข่งขันย่อยของdefaultProps
PageProps
เพิ่มเติมเกี่ยวกับคำเตือนนี้จะอธิบายที่นี่
- ต้องใช้
@types/react
เวอร์ชัน16.4.11
เพื่อให้ทำงานได้อย่างถูกต้อง
สำหรับ TypeScript 2.1 จนถึง 3.0
ก่อน typescript 3.0 สนับสนุนคอมไพเลอร์นำมาใช้สำหรับdefaultProps
คุณยังสามารถใช้ประโยชน์จากมันและมันทำงานได้ 100% กับการตอบสนองที่รันไทม์ แต่เนื่องจาก typescript พิจารณาเฉพาะอุปกรณ์ประกอบฉากเมื่อตรวจหา JSX ?
แอตทริบิวต์ที่คุณจะต้องประกอบฉากเครื่องหมายที่มีค่าเริ่มต้นเป็นตัวเลือกด้วย ตัวอย่าง:
interface PageProps {
foo?: string;
bar: number;
}
export class PageComponent extends React.Component<PageProps, {}> {
public static defaultProps: Partial<PageProps> = {
foo: "default"
};
public render(): JSX.Element {
return (
<span>Hello, world</span>
);
}
}
โปรดทราบว่า:
- มันเป็นความคิดที่ดีที่อธิบาย
defaultProps
ด้วยPartial<>
เพื่อที่จะพิมพ์-ตรวจสอบกับอุปกรณ์ประกอบฉากของคุณ แต่คุณไม่จำเป็นต้องจัดหาสถานที่ให้บริการที่จำเป็นทุกท่านด้วยค่าเริ่มต้นซึ่งทำให้รู้สึกไม่เนื่องจากคุณสมบัติที่จำเป็นไม่ควรจะต้องเริ่มต้น
- เมื่อใช้
strictNullChecks
ค่าของthis.props.foo
จะเป็นpossibly undefined
และต้องมีการยืนยันไม่ใช่ null (คือthis.props.foo!
) หรือประเภทยาม (คือif (this.props.foo) ...
) undefined
เพื่อลบ สิ่งนี้น่ารำคาญเนื่องจากค่า prop เริ่มต้นหมายความว่ามันจะไม่ถูกกำหนด แต่ TS ไม่เข้าใจโฟลว์นี้ นั่นเป็นหนึ่งในเหตุผลหลักที่ TS สนับสนุนอย่างชัดเจน 3.0 defaultProps
เพิ่มสำหรับ
ก่อน TypeScript 2.1
สิ่งนี้ใช้งานได้เหมือนกัน แต่คุณไม่มีPartial
ประเภทดังนั้นเพียงแค่ละเว้นPartial<>
และระบุค่าเริ่มต้นสำหรับอุปกรณ์ประกอบฉากที่จำเป็นทั้งหมด (แม้ว่าจะไม่ใช้ค่าเริ่มต้นเหล่านั้น) หรือละเว้นคำอธิบายประกอบประเภทที่ชัดเจน
คุณสามารถใช้defaultProps
กับองค์ประกอบของฟังก์ชั่นเช่นกัน แต่คุณต้องพิมพ์ฟังก์ชั่นของคุณไปFunctionComponent
( StatelessComponent
ใน@types/react
ก่อนรุ่น16.7.2
) อินเตอร์เฟซเพื่อให้ typescript รู้เกี่ยวกับdefaultProps
ฟังก์ชั่นนี้
interface PageProps {
foo?: string;
bar: number;
}
const PageComponent: FunctionComponent<PageProps> = (props) => {
return (
<span>Hello, {props.foo}, {props.bar}</span>
);
};
PageComponent.defaultProps = {
foo: "default"
};
โปรดทราบว่าคุณไม่จำเป็นต้องใช้Partial<PageProps>
ที่ใดก็ได้เนื่องจากFunctionComponent.defaultProps
มีการระบุไว้เป็นบางส่วนใน TS 2.1+ แล้ว
อีกทางเลือกที่ดี (นี่คือสิ่งที่ฉันใช้) คือการจัดโครงสร้างprops
พารามิเตอร์ของคุณและกำหนดค่าเริ่มต้นโดยตรง:
const PageComponent: FunctionComponent<PageProps> = ({foo = "default", bar}) => {
return (
<span>Hello, {foo}, {bar}</span>
);
};
ถ้าอย่างนั้นคุณก็ไม่ต้องการdefaultProps
อะไรเลย! โปรดทราบว่าถ้าคุณไม่ให้defaultProps
ในส่วนฟังก์ชั่นมันจะมีความสำคัญมากกว่าค่าพารามิเตอร์เริ่มต้นเพราะตอบสนองจะเสมออย่างชัดเจนผ่านdefaultProps
ค่า (ดังนั้นพารามิเตอร์จะไม่ได้กำหนดจึงพารามิเตอร์เริ่มต้นจะไม่เคยใช้.) ดังนั้นคุณต้องการใช้ อย่างใดอย่างหนึ่งไม่ใช่ทั้งสองอย่าง
static defaultProps
ถูกต้อง. คุณช่วยโพสต์โค้ดนั้นได้ไหม