You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 14:00:11