type guard

Tags
type
부가 설명
union type일 경우, 그 중에서 어떤 타입인지 검사하고, 타입에 따라 처리할 수 있도록 함
비고
 
 

@@ 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