TypeScript 2.0 태그 결합 유형
만약 에 우리 가 시스템 사용자 가 선택 할 수 있 는 다음 과 같은 지불 방식 으로 모델 링 을 한다 고 가정 합 니 다.
현금(현금)PayPal 과 주어진 이메일 주소Credit card 는 주어진 카드 번호 와 안전 코드 를 가지 고 있 습 니 다이러한 지불 방법 에 대해 우 리 는 TypeScript 인 터 페 이 스 를 만 들 수 있다.
interface Cash {
kind: "cash";
}
interface PayPal {
kind: "paypal",
email: string;
}
interface CreditCard {
kind: "credit";
cardNumber: string;
securityCode: string;
}
필요 한 정 보 를 제외 하고 모든 유형 은 하나의 kind 속성,즉 판별 속성 이 있 습 니 다.이 곳 의 모든 상황 은 문자열 의 글자 크기 형식 입 니 다.현재 Payment Method 형식 을 정의 합 니 다.이것 은 우리 가 방금 정의 한 세 가지 유형의 집합 입 니 다.이러한 방식 을 통 해 Payment Method 의 모든 변 수 는 주어진 세 가지 구성 유형 중 하 나 를 가 져 야 합 니 다.
type PaymentMethod = Cash | PayPal | CreditCard;
현재 우리 의 유형 은 이미 준비 되 었 습 니 다.지불 방법 을 받 아들 이 고 읽 을 수 있 는 말 을 되 돌려 주 는 함 수 를 만 듭 니 다.
function describePaymentMethod(method: PaymentMethod) {
switch (method.kind) {
case "cash":
// Here, method has type Cash
return "Cash";
case "paypal":
// Here, method has type PayPal
return `PayPal (${method.email})`;
case "credit":
// Here, method has type CreditCard
return `Credit card (${method.cardNumber})`;
}
}
우선,이 함수 에 포 함 된 형식 설명 이 적 고 method 매개 변 수 는 하나 만 포함 합 니 다.그 밖 에 함 수 는 기본적으로 순수 ES 2015 코드 입 니 다.switch 문장의 모든 케이스 에서 TypeScript 컴 파일 러 는 하나의 구성원 형식 으로 연합 형식 을 축소 합 니 다.예 를 들 어"paypal"과 일치 하면 method 매개 변수의 유형 은 Payment Method 에서 PayPal 로 축소 합 니 다.따라서,우 리 는 email 속성 에 접근 할 수 있 으 며,유형 단언 을 추가 할 필요 가 없습니다.
본질 적 으로 컴 파일 러 추적 프로그램 은 연합 유형 을 축소 하기 위해 흐름 을 제어 한다.switch 문 구 를 제외 하고 조건 과 할당,반환 의 영향 도 고려 해 야 합 니 다.
function describePaymentMethod(method: PaymentMethod) {
if (method.kind === "cash") {
// Here, method has type Cash
return "Cash";
}
// Here, method has type PayPal | CreditCard
if (method.kind === "paypal") {
// Here, method has type PayPal
return `PayPal (${method.email})`;
}
// Here, method has type CreditCard
return `Credit card (${method.cardNumber})`;
}
흐름 을 제어 하 는 유형 분석 은 태그 결합 유형 을 사용 하 는 것 이 매우 순 조 롭 습 니 다.최소한 의 TypeScript 문법 비용 을 사용 하면 우 리 는 거의 순수한 js 를 작성 할 수 있 고 유형 검사 와 코드 완성 에서 이득 을 볼 수 있 습 니 다.태그 결합 형식 으로 Redux 작업 구축
연합 형식 이 진정 으로 역할 을 발휘 하 는 사례 를 표시 하 는 것 은 TypeScript 응용 프로그램 에서 Redux 를 사용 할 때 입 니 다.하나의 모델,두 개의 actions,하나의 Todo 응용 프로그램의 reducer 를 포함 한 사례 를 작성 합 니 다.
다음은 하나의 todo 를 나타 내 는 간단 한 Todo 유형 입 니 다.속성 이 수정 되 지 않도록 readonly 수식 자 를 사용 합 니 다.
interface Todo {
readonly text: string;
readonly done: boolean;
}
사용 자 는 새로운 todos 를 추가 하고 기 존 todos 의 완성 상 태 를 전환 할 수 있 습 니 다.이러한 수요 에 따라 우 리 는 두 개의 Redux 조작 이 필요 하 다.다음 과 같다.
interface AddTodo {
type: "ADD_TODO";
text: string;
}
interface ToggleTodo {
type: "TOGGLE_TODO";
index: number
}
앞의 예제 와 마찬가지 로 이 제 는 Redux 작업 을 응용 프로그램 이 지원 하 는 모든 작업 의 결합 으로 구축 할 수 있 습 니 다.
type ReduxAction = AddTodo | ToggleTodo;
이 예 에서 type 속성 은 판별 속성 을 충당 하고 Redux 에서 흔히 볼 수 있 는 명명 모드 를 따른다.현재 이 두 action 과 함께 일 하 는 Reducer 를 추가 합 니 다.
function todosReducer(
state: ReadonlyArray<Todo> = [],
action: ReduxAction
): ReadonlyArray<Todo> {
switch (action.type) {
case "ADD_TODO":
// action has type AddTodo here
return [...state, { text: action.text, done: false }];
case "TOGGLE_TODO":
// action has type ToggleTodo here
return state.map((todo, index) => {
if (index !== action.index) {
return todo;
}
return {
text: todo.text,
done: !todo.done
};
});
default:
return state;
}
}
마찬가지 로 함수 서명 만 형식 설명 을 포함 합 니 다.코드 의 나머지 부분 은 TypeScript 가 아 닌 순수 ES 2015 입 니 다.우 리 는 앞의 예시 와 같은 논 리 를 따른다.Redux 작업 의 type 속성 을 기반 으로 기 존 상 태 를 수정 하지 않 고 새 상 태 를 계산 합 니 다.switch 문장의 경우,우 리 는 모든 조작 유형의 text 와 index 속성 에 접근 할 수 있 으 며,어떠한 종류의 단언 도 필요 하지 않 습 니 다.
never 형식
TypeScript 2.0 은 새로운 원본 형식 never 를 도 입 했 습 니 다.never 형식 은 값 을 표시 하 는 형식 이 나타 나 지 않 습 니 다.구체 적 으로 말 하면 never 는 함수 의 반환 유형 을 영원히 되 돌려 주지 않 고 변수 가 유형 보호 에서 true 가 되 지 않 는 유형 입 니 다.
이것 은 never 유형의 정확 한 특징 입 니 다.다음 과 같 습 니 다.
영원히 돌아 오지 않 는 함수
다음은 영원히 돌아 오지 않 는 함수 예제 입 니 다.
// Type () => never
const sing = function() {
while (true) {
console.log(" , !");
console.log(" , !");
console.log(" , !");
console.log(" , !");
console.log(" , !");
console.log(" , !");
}
}
이 함 수 는 break 나 return 문 구 를 포함 하지 않 는 무한 순환 으로 구성 되 어 있어 순환 을 벗 어 날 수 없습니다.따라서 함수 의 반환 유형 은 never 로 추정 된다.유사 하 게 아래 함수 의 반환 유형 은 never 로 추정 된다.
// Type (message: string) => never
const failwith = (message: string) => {
throw new Error(message);
};
TypeScript 는 never 형식 을 추정 합 니 다.이 함 수 는 형식 설명 을 되 돌려 주지 않 았 고 도착 할 수 있 는 점 이 없 기 때 문 입 니 다.(제어 흐름 분석 에 의 해 결 정 됩 니 다)이 유형의 변 수 는 있 을 수 없습니다.
또 다른 상황 은 never 유형 이 ture 로 추정 되 지 않 는 다 는 것 이다.다음 예제 에서 우 리 는 value 매개 변수 가 문자열 과 숫자 가 동시에 있 는 지 확인 합 니 다.이것 은 불가능 합 니 다.
function impossibleTypeGuard(value: any) {
if (
typeof value === "string" &&
typeof value === "number"
) {
value; // Type never
}
}
이 예 는 분명히 지나치게 해서 더욱 실제 적 인 용례 를 보 는 것 이다.다음 예제 에 서 는 TypeScript 의 제어 흐름 분석 이 유형 수비 하 변수의 결합 유형 을 축소 시 켰 음 을 보 여 줍 니 다.직관 적 으로 말 하면 유형 검사 기 는 우리 가 value 가 문자열 이라는 것 을 검사 하면 숫자 가 될 수 없고 반대로 도 마찬가지 라 는 것 을 안다.
function controlFlowAnalysisWithNever(
value: string | number
) {
if (typeof value === "string") {
value; // Type string
} else if (typeof value === "number") {
value; // Type number
} else {
value; // Type never
}
}
마지막 else 분기 에서 value 는 문자열 도 숫자 도 아 닙 니 다.이러한 상황 에서 TypeScript 는 never 형식 을 추정 합 니 다.우 리 는 value 매개 변 수 를 string|number 로 주 해 했 기 때 문 입 니 다.즉,string 이나 number 를 제외 하고 value 매개 변 수 는 다른 유형 이 있 을 수 없습니다.제어 흐름 분석 이 string 과 number 를 value 형식의 후보 항목 으로 제외 하면 유형 검사 기 는 never 유형 을 추정 하 는데 이것 이 유일한 가능성 이다.그러나,우 리 는 value 에 대해 어떠한 유용 한 일 도 할 수 없습니다.왜냐하면 그것 의 유형 은 never 이기 때문에,우리 의 편집기 도 구 는 이 값 이 어떤 방법 이나 속성 을 사용 할 수 있 는 지 자동 으로 표시 하지 않 습 니 다.
never 와 void 의 차이
TypeScript 에 왜 void 형식 이 있 는 지,왜 never 형식 이 필요 한 지 물 어 볼 수 있 습 니 다.비록 이 두 가 지 는 매우 비슷 해 보이 지만,그것들 은 두 가지 다른 개념 이다.
명시 적 반환 값 이 없 는 함 수 는 undefined 를 암시 적 으로 되 돌려 줍 니 다.비록 우 리 는 일반적으로 이런 함수 가"아무것도 되 돌려 주지 않 는 다"고 말 하지만,그것 은 되 돌아 올 것 이다.이런 상황 에서 우 리 는 보통 반환 값 을 소홀히 한다.이러한 함 수 는 TypeScript 에서 void 반환 형식 으로 추정 된다.
never 반환 형식 을 가 진 함 수 는 영원히 돌아 오지 않 습 니 다.그것 도 undefined 로 돌아 가지 않 습 니 다.이 함수 가 정상적으로 완성 되 지 않 았 다 는 것 은 오류 가 발생 하거나 실행 이 완료 되 지 않 는 다 는 것 을 의미한다.
함수 성명 의 유형 추정
함수 성명 의 반환 유형 에 대해 작은 문제 가 있 을 것 으로 추정 합 니 다.우리 가 앞에서 열거 한 몇 가지 never 특징 을 너 는 아래 의 이 말 을 발견 할 것 이다.
함수 표현 식 이나 화살표 함수 가 형식 주 해 를 되 돌려 주지 않 았 을 때 함수 가 return 문 구 를 가지 고 있 지 않 거나 never 형식 표현 식 의 return 문 구 를 가지 고 있 으 며 함수 가 종점 까지 실행 할 수 없 는 경우(예 를 들 어 제어 흐름 분석 을 통 해 결 정 된 것)함수 의 반환 유형 은 never 로 추정 된다.
함수 표현 식 과 화살표 함 수 를 언급 했 지만 함수 설명 은 언급 되 지 않 았 습 니 다.즉,함수 표현 식 으로 추정 되 는 반환 형식 은 함수 성명 으로 추정 되 는 반환 형식 과 다 를 수 있 습 니 다.
// Return type: void
function failwith1(message: string) {
throw new Error(message);
}
// Return type: never
const failwith2 = function(message: string) {
throw new Error(message);
};
이런 행위 의 원인 은 뒤로 호환성 이 있 기 때문에 다음 과 같다.함수 성명 의 반환 형식 never 를 원한 다 면 명시 적 설명 을 할 수 있 습 니 다.
function failwith1(message: string): never {
throw new Error(message);
}
이상 은 TypeScript 2.0 태그 연합 유형 에 대한 상세 한 내용 입 니 다.TS 2.0 태그 연합 유형 에 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
TypeScript 매핑 유형 및 더 나은 글꼴 유형 추정 이해이것은 유형 시스템에 대한 강력한 보충입니다.본질적으로, 맵 형식은 w가 맵 속성 형식을 통해 기존 형식에서 새로운 형식을 만들 수 있도록 합니다.우리가 지정한 규칙에 따라 기존 유형의 모든 속성을 변환합니다.변환된...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.