Definitelytyped: @types/react κΈ°λŠ₯ ꡬ성 μš”μ†Œμ—μ„œ λ¬Έμžμ—΄μ„ λ Œλ”λ§ν•  수 μžˆλ„λ‘ ν•©λ‹ˆλ‹€.

에 λ§Œλ“  2017λ…„ 10μ›” 13일  Β·  19μ½”λ©˜νŠΈ  Β·  좜처: DefinitelyTyped/DefinitelyTyped

  • [x] @types/react νŒ¨ν‚€μ§€λ₯Ό μ‚¬μš©ν•΄ λ³΄μ•˜λŠ”λ° λ¬Έμ œκ°€ μžˆμ—ˆμŠ΅λ‹ˆλ‹€.
  • [x] μ•ˆμ •μ μΈ μ΅œμ‹  λ²„μ „μ˜ tscλ₯Ό μ‚¬μš©ν•΄ λ³΄μ•˜μŠ΅λ‹ˆλ‹€. https://www.npmjs.com/package/typescript
  • [x] StackOverflow 에 μ ν•©ν•˜μ§€ μ•Šμ€ 질문이 μžˆμŠ΅λ‹ˆλ‹€. (μ μ ˆν•œ 질문이 있으면 κ±°κΈ°μ—μ„œ μ§ˆλ¬Έν•˜μ‹­μ‹œμ˜€.)
  • [x] [λ©˜μ…˜](https://github.com/blog/821-mention-somebody-they-re-notified) μ €μž( Definitions by: in index.d.ts μ°Έμ‘°) λŒ€λ‹΅ν•˜λ‹€.

    • μž‘μ„±μž: @johnnyreilly , @bbenezech , ...

ν˜„μž¬ 타이핑을 μ‚¬μš©ν•˜λ©΄ λ¬Έμžμ—΄, 숫자, λΆ€μšΈ...(React 16의 μƒˆλ‘œμš΄ κΈ°λŠ₯)을 λ°˜ν™˜ν•˜λŠ” μƒνƒœ λΉ„μ €μž₯ ꡬ성 μš”μ†Œλ₯Ό 생성할 수 μ—†μŠ΅λ‹ˆλ‹€.

import React from 'react'

const TestString = () => {
    return 'Test String Component'
}

const Component = () => (
    <div>
        <TestString/>
    </div>
)

λ‚΄κ°€ μ–»λŠ” 였λ₯˜:

JSX element type 'string' is not a constructor function for JSX elements.

첫 번째 λ¬Έμ œλŠ” ν˜„μž¬ νƒ€μ΄ν•‘μ—μ„œ stateless ꡬ성 μš”μ†Œκ°€ React.Element μΈμŠ€ν„΄μŠ€ 외에 λ‹€λ₯Έ 것을 λ°˜ν™˜ν•  수 μ—†λ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€. 이것은 λ³€κ²½λ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€(μ €λŠ” render λ©”μ„œλ“œμ˜ λ³€κ²½ 사항을 기반으둜 ν–ˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.html μ°Έμ‘°). d.ts#L422)

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

두 번째 λ¬Έμ œλŠ” λ’€μ—μ„œ μ»΄νŒŒμΌλŸ¬κ°€ jsxλ₯Ό `React.createElement('Test String Component', null)``둜 λ³€ν™˜ν•œλ‹€λŠ” κ²ƒμž…λ‹ˆλ‹€.

이것이 μœ νš¨ν•œ 값이 μ•„λ‹ˆλΌλŠ” 컴파일러 였λ₯˜κ°€ λ°œμƒν•©λ‹ˆλ‹€. https://github.com/DefinitelyTyped/DefinitelyTyped/blob/master/types/react/index.d.ts#L3465 λͺ©λ‘μ— μ§€μ •λœ κ°’ 쀑 ν•˜λ‚˜μ—¬μ•Ό ν•©λ‹ˆλ‹€.

이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법에 λŒ€ν•œ 생각이 μžˆμŠ΅λ‹ˆκΉŒ?

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

이 λ¬Έμ œμ— λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

λͺ¨λ“  19 λŒ“κΈ€

@DovydasNavickas @sandersn @tkrotoff @andy-ms @ddwwcruz @apexskier @devrelm @RyanCavanaugh @richseviora @onigoetz @minestarks @yuit @sboehler @ plantain-00 @p - jackson @ miracle2k @voxmatt @morgasparx @janechuando @dyst5422 @rapilabs @cynecx @newyankeecodeshop

ν˜„μž¬ ReactNode λ₯Ό λ°˜ν™˜ν•˜λŠ” μƒνƒœ λΉ„μ €μž₯ 및 클래슀 기반 ꡬ성 μš”μ†Œλ₯Ό μ •μ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€. v16으둜 λ§ˆμ΄κ·Έλ ˆμ΄μ…˜ν•˜μ§€ μ•Šμ•˜μœΌλ―€λ‘œ ν…ŒμŠ€νŠΈκ°€ ν•„μš”ν•©λ‹ˆλ‹€.

이미 PR이 μ—΄λ¦° 것 κ°™μŠ΅λ‹ˆλ‹€. https://github.com/DefinitelyTyped/DefinitelyTyped/pull/20097

이것은 atmμ—μ„œ μž‘λ™ν•©λ‹ˆκΉŒ?

변경을 μ‹œλ„ν–ˆμ§€λ§Œ λ°˜ν™˜ μœ ν˜•μ΄ string boolean λ˜λŠ” undefined 이면 JSX νŒŒμ„œλ₯Ό μ€‘λ‹¨ν•©λ‹ˆλ‹€.

진행 쀑인 TypeScript PR이 μžˆμŠ΅λ‹ˆλ‹€. https://github.com/Microsoft/TypeScript/pull/20239 (배열에 κ΄€ν•œ κ²ƒμ΄μ§€λ§Œ 일반적으둜 TSκ°€ JSX ꡬ성 μš”μ†Œμ—μ„œ ν—ˆμš©λ˜λŠ” ν•­λͺ©μ„ μ•Œμ•„μ•Ό ν•˜λŠ” λ°©λ²•μž…λ‹ˆλ‹€)

μ—…λ°μ΄νŠΈ κ°μ‚¬ν•©λ‹ˆλ‹€!

이것에 λŒ€ν•œ μ΅œμ‹  μ •λ³΄λŠ” λ¬΄μ—‡μž…λ‹ˆκΉŒ? μœ„μ—μ„œ μ–ΈκΈ‰ν•œ TS PR(https://github.com/Microsoft/TypeScript/pull/20239)이 이제 λ‹«νžˆκ±°λ‚˜ 잠겨 μžˆμŠ΅λ‹ˆλ‹€. λ‚˜λŠ” 였늘 typescript + reactλ₯Ό 처음 μ ‘ν–ˆκ³  μ™œ λ‚΄ ꡬ성 μš”μ†Œκ°€ κ°‘μžκΈ° λ¬Έμžμ—΄μ„ λ°˜ν™˜ν•  수 μ—†λŠ”μ§€ κΆκΈˆν•©λ‹ˆλ‹€...

ν•΄κ²° 방법은 쑰각을 λ°˜ν™˜ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€.

return <>0</>

이 λ¬Έμ œμ— λŒ€ν•œ μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

μ•ˆλ…•ν•˜μ„Έμš”, 이에 λŒ€ν•œ μ—…λ°μ΄νŠΈλ‚˜ 힌트 λΆ€νƒλ“œλ¦½λ‹ˆλ‹€ :) ?

이것은 본질적으둜 #18912의 λ³΅μ œλ³Έμž…λ‹ˆλ‹€. Microsoft/TypeScript#21699κ°€ ν•΄κ²°λ˜λ©΄ string 및 boolean λ₯Ό ν¬ν•¨ν•˜λŠ” ν•¨μˆ˜ ꡬ성 μš”μ†Œμ— λŒ€ν•œ μœ νš¨ν•œ λ°˜ν™˜ μœ ν˜•μœΌλ‘œ ReactNode λ₯Ό μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

문제λ₯Ό μΌλ°˜ν™”ν•˜κΈ° μœ„ν•΄ μ™œ React에 λŒ€ν•΄ 합법이라고 κ°€μ •ν•΄μ•Ό ν•©λ‹ˆκΉŒ? @jsx / @jsxFrag Babel pragmaλ₯Ό μ‚¬μš©ν•˜λ©΄ 이 JSX와 같은 μ ‘κ·Ό 방식이 λͺ¨λ“  κΈ°λŠ₯μ—μ„œ μž‘λ™ν•  수 μžˆμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ λ¬Έμžμ—΄λ§Œ ν—ˆμš©λ˜μ–΄μ•Ό ν•˜λŠ” 것은 μ•„λ‹™λ‹ˆλ‹€. λͺ¨λ“  λ°˜ν™˜ 값은 합법적일 수 있으며 νŠΉμ • μš©λ„λ‘œλ§Œ μ œν•œλ©λ‹ˆλ‹€. ReactλŠ” μ€‘μš”ν•˜μ§€λ§Œ νŠΉμ • λ Œλ”λ§ 라이브러리일 λΏμž…λ‹ˆλ‹€.

μ˜€ν”ˆν•œμ§€ 거의 2년이 λ‹€ λ˜μ–΄κ°€λŠ”λ° 해결책이 μ—†μ„κΉŒμš”?

μ œμ•ˆλœ λ°˜ν™˜ 쑰각 <>StringValueκ°€ 여기에 ν‘œμ‹œλ¨> - λ¬Έμžμ—΄ 값을 μ–»λŠ” λ°©λ²•μ΄λ‚˜ λ‚΄ μ½”λ“œμ—μ„œ μ‹€μ œλ‘œ μ‚¬μš©ν•  React.Elementκ°€ μ•„λ‹Œ λ‹€λ₯Έ μœ ν˜•μ˜ 값을 μ–»λŠ” 방법을 μ΄ν•΄ν•˜λŠ” 데 λ¬Έμ œκ°€ μžˆλŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 예λ₯Ό λ“€μ–΄ λ‹€μŒκ³Ό 같은 경우 <>"hello">λ₯Ό λ°˜ν™˜ν•˜λŠ” HowdyλΌλŠ” ν•¨μˆ˜κ°€ 있고 componentDidMount 내뢀에

const whatSays =

μ‘°κ°μ—μ„œ λ¬Έμžμ—΄ 값을 μ–»λŠ” 방법은 λ¬΄μ—‡μž…λ‹ˆκΉŒ? 방법이 μ—†μŠ΅λ‹ˆλ‹€. 이 문제λ₯Ό ν•΄κ²°ν•˜λŠ” 방법은 맀우 μΆ”μ•…ν•œ 해킹이며 Hooks APIκ°€ μ’…μ’… λ¬Έμžμ—΄ λ˜λŠ” 기타 λΉ„ React Element κ°’(예 : https://github)을 λ°˜ν™˜ν•˜λŠ” 데 μ‚¬μš©λœλ‹€λŠ” 점을 κ³ λ €ν•˜λ©΄ λŠλ‚Œμ΄ λ“­λ‹ˆλ‹€. com/pankod/react-hooks-screen-type/blob/master/src/index.js
이 λ²„κ·Έλ‘œ 인해 Hooks APIλ₯Ό μ‚¬μš©ν•  수 μ—†κ²Œ λ˜μ–΄ Typescriptκ°€ React에 μ ν•©ν•˜μ§€ μ•Šμ€ 것 κ°™μŠ΅λ‹ˆλ‹€.

μ˜€ν”ˆν•œμ§€ 거의 2년이 λ‹€ λ˜μ–΄κ°€λŠ”λ° 해결책이 μ—†μ„κΉŒμš”?

@bryanrasmussen λ§ˆμ§€λ§‰ μ—…λ°μ΄νŠΈλŠ” https://github.com/DefinitelyTyped/DefinitelyTyped/issues/20544#issuecomment -459665668을 μ°Έμ‘°ν•˜μ„Έμš”.

이 문제둜 인해 TypeScript에 μ˜ν•΄ λΆ€κ³Όλœ μ œν•œ 사항을 ν•΄κ²°ν•˜κΈ° μœ„ν•΄ 일반적인 React μ½”λ“œλ₯Ό μž‘μ„±ν•˜κ²Œ λ˜μ—ˆμŠ΅λ‹ˆλ‹€. TypeScript λ°©μ‹μœΌλ‘œ μ΄λŸ¬ν•œ 였λ₯˜λ₯Ό μ²˜λ¦¬ν•˜λŠ” μœ μΌν•œ 방법은 μΆ”κ°€ DOM μš”μ†Œ 및/λ˜λŠ” React.Fragmentsλ₯Ό λ„μž…ν•˜λŠ” κ²ƒμž…λ‹ˆλ‹€. μ΄λŸ¬ν•œ μš”μ†ŒλŠ” μ˜€λ²„ν—€λ“œλ₯Ό μΆ”κ°€ν•˜κ³ (가비지 생성) ν•„μš”ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.

이것이 항상 λ¬Έμ œκ°€ λ˜λŠ” 것은 μ•„λ‹ˆλ©° μ •ν™•νžˆ JSX.Elementκ°€ μ•„λ‹Œ React ꡬ성 μš”μ†Œ(예: λ°°μ—΄)μ—μ„œ μœ νš¨ν•œ ν•­λͺ©μ„ λ°˜ν™˜ν•  λ•Œ νŠΈλ¦¬κ±°λ©λ‹ˆλ‹€.

λ‚˜λŠ” 일을 돕기 μœ„ν•΄ 합리적인 μœ ν˜• 주석에 λ§Œμ‘±ν•˜μ§€λ§Œ μΆ”κ°€ λ ˆμ΄μ–΄ 및/λ˜λŠ” any 와 같은 λΆˆμ™„μ „ν•œ κ²ƒλ“€λ‘œ 이것듀을 λΆ€μˆ˜μ–΄μ•Ό ν•©λ‹ˆλ‹€. μ•ˆμ’‹λ‹€.

λΆˆν•„μš”ν•œ React.Fragment 둜 λž˜ν•‘ν•˜λ©΄ λŸ°νƒ€μž„μ— (μ‚¬μ†Œν•˜μ§€ μ•Šμ€) λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€.

이것은 λŸ°νƒ€μž„ νŒ¨λ„ν‹° 없이 또 λ‹€λ₯Έ ν•΄κ²° 방법이 될 수 μžˆμŠ΅λ‹ˆκΉŒ?

import React, { ReactElement } from 'react'

const TestString = () => {
  return ('Test String Component' as unknown) as ReactElement
}

const Component = () => (
  <div>
    <TestString />
  </div>
)

export default Component

λΆˆν•„μš”ν•œ React.Fragment 둜 λž˜ν•‘ν•˜λ©΄ λŸ°νƒ€μž„μ— (μ‚¬μ†Œν•˜μ§€ μ•Šμ€) λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€.

νƒ€ν˜‘μž…λ‹ˆλ‹€. κ·Έλž˜λ„ 더 λ‚˜μ€ 타이핑을 보고 μ‹ΆμŠ΅λ‹ˆλ‹€. λ˜ν•œ μ€‘μš”ν•˜μ§€ μ•Šμ€ 것은 μ»¨ν…μŠ€νŠΈμ— 따라 λ‹€λ¦…λ‹ˆλ‹€. λͺ‡ 쑰각은 아프지 μ•Šκ³  λ§Žμ€ 쑰각이 μƒμ²˜λ₯Ό 쀄 κ²ƒμž…λ‹ˆλ‹€.

λΆˆν•„μš”ν•œ React.Fragment 둜 λž˜ν•‘ν•˜λ©΄ λŸ°νƒ€μž„μ— (μ‚¬μ†Œν•˜μ§€ μ•Šμ€) λΉ„μš©μ΄ λ°œμƒν•©λ‹ˆλ‹€.

이것은 λŸ°νƒ€μž„ νŒ¨λ„ν‹° 없이 또 λ‹€λ₯Έ ν•΄κ²° 방법이 될 수 μžˆμŠ΅λ‹ˆκΉŒ?

import React, { ReactElement } from 'react'

const TestString = () => {
  return ('Test String Component' as unknown) as ReactElement
}

const Component = () => (
  <div>
    <TestString />
  </div>
)

export default Component

예, ν•˜μ§€λ§Œ ν•¨μˆ˜μ— λŒ€ν•œ μœ ν˜• 검사도 μžƒκ²Œ λ©λ‹ˆλ‹€. λŸ°νƒ€μž„ νŒ¨λ„ν‹° 없이 λ‚΄ ν”„λ‘œμ νŠΈμ—μ„œ TSλ₯Ό μ œκ±°ν•  μˆ˜λ„ μžˆμ§€λ§Œ μœ ν˜• 검사가 μ—†μŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ ν•΄κ²° 방법은 ν™•μ‹€νžˆ μž‘λ™ν•˜μ§€λ§Œ TS의 λͺ©μ μ„ 깨뜨릴 λΏμž…λ‹ˆλ‹€. "κΈ°λŒ€ν•˜λŠ” 것"으둜 μΊμŠ€νŒ…ν•˜λŠ” 것은 "μ’‹μ•„, 그럼 μ‰¬λŠ” μ‹œκ°„μ„ λ²„λ¦¬μž. λˆ„κ°€ 이것을 ν•„μš”λ‘œ ν•˜λŠλƒ?"라고 λ§ν•˜λŠ” 것과 κ°™μŠ΅λ‹ˆλ‹€. 쑰각으둜 κ°μŒ€ λ•Œ μ˜¬λ°”λ₯Έ μœ ν˜• 검사λ₯Ό μ–»μŠ΅λ‹ˆλ‹€!

κ·Έλž˜μ„œ μˆ˜μ • μ†Œμ‹μ΄ μžˆμŠ΅λ‹ˆκΉŒ?

이 νŽ˜μ΄μ§€κ°€ 도움이 λ˜μ—ˆλ‚˜μš”?
0 / 5 - 0 λ“±κΈ‰