如何用TypeScript类型系统检查内部对象中键的存在性?
问题:实现带编译时校验的LPool类型
现有代码定义
TOKENS 对象
const TOKENS = { USDT: { address: "0xUSDT", WETH: "0xWETHUSDT", // LPool<TYPES.USDT, TYPES.WETH> }, WETH: { address: "0xWETH", USDT: "0xUSDTWETH", // LPool<TYPES.WETH, TYPES.USDT> } };
命名空间与 Token 类型
namespace TYPES { export type USDT = "USDT"; export type WETH = "WETH"; } namespace CONSTS { export const USDT = "USDT" as const; export const WETH = "WETH" as const; } type Token = keyof typeof TOKENS; // type Token = "USDT" | "WETH"
swap 函数
function swap<Token0 extends Token, Token1 extends Token>(contact: LPool<Token0, Token1>) { return; }
需求
需要定义LPool<Token0, Token1>类型,实现编译时校验:当Token0对应的TOKENS属性中不存在Token1键时,传入该泛型参数的swap函数会报错。例如:
swap<TYPES.USDT, TYPES.USDT>("USDT") // 编译阶段应当报错
解决方案
type LPool<Token0 extends Token, Token1 extends Token> = Token1 extends keyof typeof TOKENS[Token0] ? typeof TOKENS[Token0][Token1] : never;
说明
- 通过条件类型判断
Token1是否属于TOKENS[Token0]的有效键 - 若合法,返回对应的池地址类型;若不合法,返回
never类型,此时任何传入的参数都会触发编译错误,达到校验目的
内容的提问来源于stack exchange,提问作者Jim
相关产品推荐
相关产品推荐

