@@ in props
import React from 'react';
// interface Rectangle {
// x: number
// y: number
// width: number
// height: number
// }
// interface Point {
// x: number
// y: number
// }
// type Props = Rectangle | Point
// const Shape = ({...props}:Props)=>{
// }
// <Shape />
// type UnionKeys<T> = T extends T ? keyof T : never;
// type StrictUnionHelper<T, TAll> = T extends any ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
// type StrictUnion<T> = StrictUnionHelper<T, T>
// type T = StrictUnion<{A: number, B: number} | {C: number }>;
// type NetworkLoadingState = {
// state: "loading";
// };
// type NetworkFailedState = {
// state: "failed";
// code: number;
// };
// type NetworkSuccessState = {
// state: "success";
// response: {
// title: string;
// duration: number;
// summary: string;
// };
// };
// // Create a type which represents only one of the above types
// // but you aren't sure which it is yet.
// type NetworkState =
// | NetworkLoadingState
// | NetworkFailedState
// | NetworkSuccessState;
// const Test = ({...props}:NetworkState) => {
// return(<></>);
// }
// <Test state='loading' code={3} />
// https://stackoverflow.com/a/65805753
type UnionKeys<T> = T extends T ? keyof T : never;
type StrictUnionHelper<T, TAll> = T extends any ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
type StrictUnion<T> = StrictUnionHelper<T, T>
// 사용 예시 type T = StrictUnion<{A: number, B: number} | {C: number }>;
interface CheckAndProps {
checked: boolean
}
interface LockAndProps {
isLocked: boolean
}
const Test2 = ({...props}:StrictUnion<CheckAndProps | LockAndProps>) => {
if('checked' in props){
return (<></>);
}
if('isLocked' in props){
return (<></>);
}
return(<></>)
}
<>
<Test2 isLocked />
<Test2 checked />
<Test2 isLocked checked />
<Test2 isLocked ch />
</>
// https://stackoverflow.com/a/65805753
// type UnionKeys<T> = T extends T ? keyof T : never;
// type StrictUnionHelper<T, TAll> = T extends any ? T & Partial<Record<Exclude<UnionKeys<TAll>, keyof T>, never>> : never;
// type StrictUnion<T> = StrictUnionHelper<T, T>
// // 사용 예시 type T = StrictUnion<{A: number, B: number} | {C: number }>;
// interface CheckAndProps {
// "type": 'check'
// // 블라블라 check에 대한 props
// checkProps?: Record<any, any>;
// }
// interface LockAndProps {
// "type": 'lock'
// // 블라블라 check에 대한 props
// lockProps?: Record<any, any>;
// }
// const Test2 = ({...props}:CheckAndProps | LockAndProps) => {
// if(props.type === 'check'){
// // props 자동완성도 CheckAndProps에 대한 것만 나열됨.
// return(<></>)
// }
// // props 자동완성도 LockAndProps에 대한 것만 나열됨.
// return(<></>)
// }
// <>
// // props 자동완성도 CheckAndProps에 대한 것만 나열됨.
// // check 인데 lock에 대한 프롭을 쓰면 에러
// <Test2 type='check' checkProps={{}} />
// <Test2 type='check' lockProps={{}} />
// // props 자동완성도 LockAndProps에 대한 것만 나열됨.
// // lock인데 check에 대한 프롭을 쓰면 에러
// <Test2 type='lock' lockProps={{}}/>
// <Test2 type='lock' checkProps={{}}/>
// </>
instanceof
typeof