문서의 선택한 두 판 사이의 차이를 보여줍니다.
| 양쪽 이전 판이전 판다음 판 | 이전 판 | ||
| typescript:jsx [2019/07/30 10:11] – taekgu | typescript:jsx [2025/04/15 10:05] (현재) – 바깥 편집 127.0.0.1 | ||
|---|---|---|---|
| 줄 86: | 줄 86: | ||
| </ | </ | ||
| - | ==== 값-기반 요소 (Value-based elements) ==== | + | ===== 값-기반 요소 (Value-based elements) |
| 값 기반 요소는 스코프에 있는 식별자로 간단히 조회됩니다. | 값 기반 요소는 스코프에 있는 식별자로 간단히 조회됩니다. | ||
| 줄 98: | 줄 98: | ||
| 값 기반 요소를 정의하는 방법에는 두 가지가 있습니다: | 값 기반 요소를 정의하는 방법에는 두 가지가 있습니다: | ||
| - | - 무상태 | + | - 함수 컴포넌트(FC) |
| - 클래스 컴포넌트 | - 클래스 컴포넌트 | ||
| - | 이 두 가지 | + | 이 두 가지 |
| - | 프로세스가 성공하면 | + | |
| - | 만약 SFC로 해결하지 못한다면 클래스 | + | ===== 함수 컴포넌트(Function Component) ===== |
| - | 만약 | + | |
| - | 무상태 함수형 컴포넌트(Stateless Functional Component) | ||
| 이름에서 알 수 있듯이 컴포넌트는 첫 번째 인수가 props 객체인 JavaScript 함수로 정의됩니다. | 이름에서 알 수 있듯이 컴포넌트는 첫 번째 인수가 props 객체인 JavaScript 함수로 정의됩니다. | ||
| 반환 타입은 JSX.Element에 할당할 수 있도록 강제합니다. | 반환 타입은 JSX.Element에 할당할 수 있도록 강제합니다. | ||
| + | <code javascript> | ||
| interface FooProp { | interface FooProp { | ||
| name: string; | name: string; | ||
| 줄 122: | 줄 121: | ||
| const Button = (prop: {value: string}, context: { color: string }) => < | const Button = (prop: {value: string}, context: { color: string }) => < | ||
| - | SFC는 단순히 JavaScript 함수이기 때문에 여기서도 함수 오버로드를 활용할 수 있습니다. | + | </ |
| + | Function Component는 단순히 JavaScript 함수이기 때문에 여기서도 함수 오버로드를 활용할 수 있습니다. | ||
| + | <code javascript> | ||
| interface ClickableProps { | interface ClickableProps { | ||
| children: JSX.Element[] | JSX.Element | children: JSX.Element[] | JSX.Element | ||
| 줄 140: | 줄 141: | ||
| ... | ... | ||
| } | } | ||
| - | 클래스 컴포넌트 (Class Component) | + | </ |
| + | >참고 : 함수 구성 요소는 이전에는 Stateless Function Components (SFC)로 알려져있었습니다. 최근 버전의 react에서는 기능 구성 요소를 더 이상 stateless로 간주 할 수 없으므로 '' | ||
| + | |||
| + | ===== 클래스 컴포넌트 (Class Component) | ||
| 클래스 컴포넌트의 타입을 제한할 수 있습니다. | 클래스 컴포넌트의 타입을 제한할 수 있습니다. | ||
| 하지만 이를 위해 새로운 두 가지를 도입해야 합니다: 요소 클래스 타입과 요소 인스턴스 타입 | 하지만 이를 위해 새로운 두 가지를 도입해야 합니다: 요소 클래스 타입과 요소 인스턴스 타입 | ||
| 줄 151: | 줄 156: | ||
| 다시 ES6 클래스의 경우, 인스턴스 타입은 해당 클래스의 인스턴스 타입이 되고 팩토리 함수의 경우 해당 함수에서 반환되는 값의 타입이 됩니다. | 다시 ES6 클래스의 경우, 인스턴스 타입은 해당 클래스의 인스턴스 타입이 되고 팩토리 함수의 경우 해당 함수에서 반환되는 값의 타입이 됩니다. | ||
| + | <code javascript> | ||
| class MyComponent { | class MyComponent { | ||
| render() {} | render() {} | ||
| 줄 173: | 줄 179: | ||
| // 요소 클래스 타입 => 팩토리 함수 | // 요소 클래스 타입 => 팩토리 함수 | ||
| // 요소 인스턴스 타입 => { render: () => void } | // 요소 인스턴스 타입 => { render: () => void } | ||
| + | </ | ||
| + | |||
| 요소 인스턴스 타입이 흥미로운 이유는 JSX.ElementClass에 할당되어야 하며 그렇지 않을 경우 오류가 발생하기 때문입니다. | 요소 인스턴스 타입이 흥미로운 이유는 JSX.ElementClass에 할당되어야 하며 그렇지 않을 경우 오류가 발생하기 때문입니다. | ||
| 기본적으로 JSX.ElementClass는 {}이지만 JSX의 사용을 적절한 인터페이스에 맞는 타입으로 제한하도록 확장할 수 있습니다. | 기본적으로 JSX.ElementClass는 {}이지만 JSX의 사용을 적절한 인터페이스에 맞는 타입으로 제한하도록 확장할 수 있습니다. | ||
| + | <code javascript> | ||
| declare namespace JSX { | declare namespace JSX { | ||
| interface ElementClass { | interface ElementClass { | ||
| 줄 199: | 줄 208: | ||
| < | < | ||
| < | < | ||
| - | 속성 타입 검사 (Attribute type checking) | + | </ |
| + | |||
| + | ===== 속성 타입 검사 (Attribute type checking) | ||
| 속성 타입 검사를 하는 첫 번째 단계는 요소 속성 타입을 결정하는 것입니다. | 속성 타입 검사를 하는 첫 번째 단계는 요소 속성 타입을 결정하는 것입니다. | ||
| 이것은 내장 요소와 값 기반 요소 간에 약간의 차이가 있습니다. | 이것은 내장 요소와 값 기반 요소 간에 약간의 차이가 있습니다. | ||
| 내장 요소의 경우 JSX.IntrinsicElements 프로퍼티의 타입입니다. | 내장 요소의 경우 JSX.IntrinsicElements 프로퍼티의 타입입니다. | ||
| + | <code javascript> | ||
| declare namespace JSX { | declare namespace JSX { | ||
| interface IntrinsicElements { | interface IntrinsicElements { | ||
| 줄 213: | 줄 225: | ||
| // ' | // ' | ||
| <foo bar />; | <foo bar />; | ||
| + | </ | ||
| + | |||
| 값 기반 요소의 경우 조금 더 복잡합니다. | 값 기반 요소의 경우 조금 더 복잡합니다. | ||
| 이전에 결정된 요소 인스턴스 타입의 프로퍼티 타입에 따라 결정됩니다. | 이전에 결정된 요소 인스턴스 타입의 프로퍼티 타입에 따라 결정됩니다. | ||
| 줄 219: | 줄 233: | ||
| 그런 다음 해당 프로퍼티의 이름이 사용됩니다. | 그런 다음 해당 프로퍼티의 이름이 사용됩니다. | ||
| + | <code javascript> | ||
| declare namespace JSX { | declare namespace JSX { | ||
| interface ElementAttributesProperty { | interface ElementAttributesProperty { | ||
| 줄 234: | 줄 249: | ||
| // ' | // ' | ||
| < | < | ||
| + | </ | ||
| 요소 속성 타입은 JSX에서 속성을 타입을 확인하는 데 사용됩니다. | 요소 속성 타입은 JSX에서 속성을 타입을 확인하는 데 사용됩니다. | ||
| 선택적 프로퍼티와 필수 프로퍼티가 지원됩니다. | 선택적 프로퍼티와 필수 프로퍼티가 지원됩니다. | ||
| + | <code javascript> | ||
| declare namespace JSX { | declare namespace JSX { | ||
| interface IntrinsicElements { | interface IntrinsicElements { | ||
| 줄 249: | 줄 266: | ||
| <foo requiredProp=" | <foo requiredProp=" | ||
| <foo requiredProp=" | <foo requiredProp=" | ||
| - | 참고: 속성 이름이 유효한 JS 식별자 (예 :data- *속성)가 아닌 경우 요소 속성 타입에서 속성 이름을 찾을 수 없으면 오류로 간주되지 않습니다. | + | </ |
| + | >참고: 속성 이름이 유효한 JS 식별자 (예 :data- *속성)가 아닌 경우 요소 속성 타입에서 속성 이름을 찾을 수 없으면 오류로 간주되지 않습니다. | ||
| - | 전개 연산자도 작동합니다: | + | 또한 JSX.IntrinsicAttributes 인터페이스는 JSX 프레임 워크에서 사용되는 추가 속성을 지정하는 데 사용할 수 있습니다.이 속성은 일반적으로 구성 요소의 소품이나 인수 (예 : React의 키)에서 사용되지 않습니다. 특히, 일반 JSX.IntrinsicClassAttributes <T> 유형은 클래스 구성 요소 (함수 구성 요소 제외)에 대해 동일한 종류의 추가 속성을 지정하는 데 사용될 수도 있습니다. 이 유형에서 제네릭 매개 변수는 클래스 인스턴스 유형에 해당합니다. React에서는 Ref <T> 유형의 ref 속성을 허용하는 데 사용됩니다. 일반적으로 JSX 프레임 워크의 사용자가 모든 태그에 일부 속성을 제공해야하는 경우가 아니라면이 인터페이스의 모든 속성을 선택적으로 지정해야합니다. |
| + | 전개 연산자도 작동합니다: | ||
| + | <code javascript> | ||
| var props = { requiredProp: | var props = { requiredProp: | ||
| <foo {...props} />; // 좋아요 | <foo {...props} />; // 좋아요 | ||
| 줄 258: | 줄 278: | ||
| var badProps = {}; | var badProps = {}; | ||
| <foo {...badProps} />; // 오류 | <foo {...badProps} />; // 오류 | ||
| - | 하위 타입 검사 (Children Type Checking) | + | </ |
| + | |||
| + | ===== 하위 타입 검사 (Children Type Checking) | ||
| 2.3 버전에서 하위 타입 검사를 도입했습니다. | 2.3 버전에서 하위 타입 검사를 도입했습니다. | ||
| 하위(children)는 요소 타입 검사에서 결정된 요소 속성 타입의 프로퍼티 입니다. | 하위(children)는 요소 타입 검사에서 결정된 요소 속성 타입의 프로퍼티 입니다. | ||
| 줄 264: | 줄 287: | ||
| JSX.ElementChildrenAttribute는 단일 프로퍼티로 선언해야합니다. | JSX.ElementChildrenAttribute는 단일 프로퍼티로 선언해야합니다. | ||
| + | <code javascript> | ||
| declare namespace JSX { | declare namespace JSX { | ||
| interface ElementChildrenAttribute { | interface ElementChildrenAttribute { | ||
| 줄 269: | 줄 293: | ||
| } | } | ||
| } | } | ||
| + | </ | ||
| 하위의 타입을 명시적으로 지정하지 않는다면 React typings의 기본 타입을 사용합니다. | 하위의 타입을 명시적으로 지정하지 않는다면 React typings의 기본 타입을 사용합니다. | ||
| + | <code jsx> | ||
| <div> | <div> | ||
| < | < | ||
| 줄 285: | 줄 311: | ||
| {"This is just a JS expression..." | {"This is just a JS expression..." | ||
| </ | </ | ||
| + | </ | ||
| + | |||
| 다른 속성과 마찬가지로 하위 타입을 지정할 수 있습니다. | 다른 속성과 마찬가지로 하위 타입을 지정할 수 있습니다. | ||
| 이렇게 하면 React typings에서 기본 타입을 덮어쓰게 됩니다. | 이렇게 하면 React typings에서 기본 타입을 덮어쓰게 됩니다. | ||
| + | <code javascript> | ||
| interface PropsType { | interface PropsType { | ||
| children: JSX.Element | children: JSX.Element | ||
| 줄 319: | 줄 348: | ||
| World | World | ||
| </ | </ | ||
| - | JSX 결과 타입 (The JSX result type) | + | </ |
| + | |||
| + | ===== JSX 결과 타입 (The JSX result type) ===== | ||
| 기본적으로 JSX 표현식의 결과 타입은 any로 분류됩니다. | 기본적으로 JSX 표현식의 결과 타입은 any로 분류됩니다. | ||
| JSX.Element 인터페이스를 지정하여 사용자 정의 타입을 사용할 수 있습니다. | JSX.Element 인터페이스를 지정하여 사용자 정의 타입을 사용할 수 있습니다. | ||
| 줄 325: | 줄 357: | ||
| 이것은 블랙박스 입니다. | 이것은 블랙박스 입니다. | ||
| - | 표현식 포함하기 (Embedding Expressions) | + | ===== 표현식 포함하기 (Embedding Expressions) |
| - | JSX는 중괄호 ({ })로 표현식을 감싸고 태그 사이에 표현식을 삽입할 수 있게합니다. | + | |
| + | JSX는 중괄호 ({ })로 표현식을 감싸고 태그 사이에 표현식을 삽입할 수 있게합니다. | ||
| + | <code javascript> | ||
| var a = <div> | var a = <div> | ||
| {[" | {[" | ||
| </ | </ | ||
| + | </ | ||
| 위의 코드는 문자열을 숫자로 나눌 수 없으므로 오류가 발생합니다. | 위의 코드는 문자열을 숫자로 나눌 수 없으므로 오류가 발생합니다. | ||
| 출력은 preserve 옵션을 사용할 때 다음과 같습니다: | 출력은 preserve 옵션을 사용할 때 다음과 같습니다: | ||
| + | <code javascript> | ||
| var a = <div> | var a = <div> | ||
| {[" | {[" | ||
| </ | </ | ||
| - | 리액트 통합 (React integration) | + | </ |
| + | |||
| + | ===== 리액트 통합 (React integration) | ||
| React와 함께 JSX를 사용하려면 React typings을 사용해야 합니다. | React와 함께 JSX를 사용하려면 React typings을 사용해야 합니다. | ||
| 이러한 typings은 React와 함께 사용하기에 적합하도록 JSX 네임스페이스를 적절하게 정의합니다. | 이러한 typings은 React와 함께 사용하기에 적합하도록 JSX 네임스페이스를 적절하게 정의합니다. | ||
| + | <code javascript> | ||
| /// < | /// < | ||
| 줄 356: | 줄 394: | ||
| < | < | ||
| < | < | ||
| + | </ | ||
| + | |||
| + | ===== Factory Functions ===== | ||
| + | jsx : react 컴파일러 옵션에서 사용되는 정확한 팩토리 함수는 구성 가능합니다. jsxFactory 명령 행 옵션이나 인라인 @jsx 주석 pragma를 사용하여 파일 단위로 설정할 수 있습니다. 예를 들어, jsxFactory를 createElement로 설정하면 <div />는 React.createElement ( " | ||
| + | |||
| + | 주석 pragma 버전은 다음과 같이 사용할 수 있습니다 (TypeScript 2.8). | ||
| + | |||
| + | <code javascript> | ||
| + | import preact = require(" | ||
| + | /* @jsx preact.h */ | ||
| + | const x = <div />; | ||
| + | </ | ||
| + | |||
| + | emits as: | ||
| + | |||
| + | <code javascript> | ||
| + | const preact = require(" | ||
| + | const x = preact.h(" | ||
| + | </ | ||
| + | 선택한 팩토리는 JSX 네임 스페이스가 전역 검사로 돌아 가기 전에 (유형 검사 정보 용으로) 조회 된 위치에도 영향을 미칩니다. 팩토리가 React.createElement (기본값)로 정의 된 경우 컴파일러는 전역 JSX를 확인하기 전에 React.JSX를 확인합니다. 팩토리가 h로 정의되면 글로벌 JSX 이전에 h.JSX를 확인합니다. | ||