TypeScript中的标记联合类型:实现Todo代办

Tagged Union Types in TypeScript — Marius Schulz

用例子来说明。

  • 标记联合类型实现多种支付方法
  • 标记联合类型实现Todo

实现多种支付方法

有三种支付方法:

  • 现金
  • paypal:需要邮箱信息
  • 信用卡:需要卡号和卡密

用代码表示即:

interface Cash {
	kind: "cash";
}

interface PayPal {
	kind: "paypal";
	email: string;
}

interface CreditCard {
	kind: "credit";
	cardNumber: string;
	securityCode: string;
}

注意,每种类型都有一个kind属性,即判别属性。它的作用在接下来的switch-case中体现。

然后我们定义一个PaymentMethod类型,它是我们上述定义的三个类型的联合:

type PaymentMethod = Cash | PayPal | CreditCard;

定义一个方法来解释我们的联合类型:

function describlePaymentMethod(method: PaymentMethod) {
	switch (method.kind) {
		case "cash": {
			return "Cash";
		}
		case "paypal": {
			return `PayPal(${method.email})`;
		}
		case "credit": {
			return `Credit card(${method.cardNumber})`;
		}
	}
}

实现Todo

先定义一个Todo接口,表示它的内容和完成状态,注意是只读的。

interface Todo {
	readonly text: string;
	readonly done: boolean;
}

用户可以添加Todo和切换Todo的完成状态:type属性表示此接口类型。

interface AddTodo {
	type: "Add_TODO";
	text: string; //要添加的todo的内容
}

interface ToggleTodo {
	type: "TOGGLE_TODO";
	index: number;//要修改的todo下标
}

用联合标记类型表示用户的两种操作:

type ReduxAction = AddTodo | ToggleTodo;

用户操作的方法:

function todoReducer(
	state: ReadonlyArray<Todo> = [],
	action: ReduxAction
): ReadonlyArray<Todo> {
	switch (action.type) {
		case "Add_TODO": {
			return [...state, { text: action.text, done: false }];
		}
		case "TOGGLE_TODO": {
			return state.map((item, index) => {
				// 要改的不是此todo,放过
				if (index !== action.index) {
					return item;
				}

				return {
					text: item.text,
					done: !item.done,
				};
			});
		}

		default: {
			return state;
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值