@types/react
ν¨ν€μ§λ₯Ό μ¬μ©ν΄ 보μλλ° λ¬Έμ κ° μμμ΅λλ€.Definitions by:
in index.d.ts
μ°Έμ‘°) λλ΅νλ€.νμ¬ νμ΄νμ μ¬μ©νλ©΄ λ¬Έμμ΄, μ«μ, λΆμΈ...(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 λͺ©λ‘μ μ§μ λ κ° μ€ νλμ¬μΌ ν©λλ€.
μ΄ λ¬Έμ λ₯Ό ν΄κ²°νλ λ°©λ²μ λν μκ°μ΄ μμ΅λκΉ?
@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μ λͺ©μ μ κΉ¨λ¨λ¦΄ λΏμ λλ€. "κΈ°λνλ κ²"μΌλ‘ μΊμ€ν νλ κ²μ "μ’μ, κ·ΈλΌ μ¬λ μκ°μ λ²λ¦¬μ. λκ° μ΄κ²μ νμλ‘ νλλ?"λΌκ³ λ§νλ κ²κ³Ό κ°μ΅λλ€. μ‘°κ°μΌλ‘ κ°μ λ μ¬λ°λ₯Έ μ ν κ²μ¬λ₯Ό μ»μ΅λλ€!
κ·Έλμ μμ μμμ΄ μμ΅λκΉ?
κ°μ₯ μ μ©ν λκΈ
μ΄ λ¬Έμ μ λν μμμ΄ μμ΅λκΉ?