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

如何对每个条目为同类型但泛型不同的Record进行类型检查?

如何一次性检查包含Stringifier的对象类型一致性?

我们需要创建一个包含多种数据类型与字符串互转方法的对象,定义的Stringifier类型如下:

type Stringifier<Source> = {
    stringIn: (string: string) => Source;
    stringOut: (source: Source) => string;
};

核心需求是让TypeScript类型检查器确保对象中每个Stringifier的stringIn输出类型与stringOut输入类型严格一致。目前的做法是为每个条目单独调用isStringifier函数来做类型校验,现在想实现一次性检查整个对象的效果。

方案一:用泛型映射类型约束对象

我们可以定义一个泛型映射类型,让它自动约束对象中每个属性对应的Stringifier类型一致性,无需额外函数调用:

type Stringifier<Source> = {
    stringIn: (string: string) => Source;
    stringOut: (source: Source) => string;
};

// 定义泛型映射类型,确保每个键对应的Stringifier的Source类型匹配
type StringifierMap<Map extends Record<string, unknown>> = {
    [K in keyof Map]: Stringifier<Map[K]>;
};

// 直接用该类型约束对象,手动声明每个键对应的目标类型
const myStringifiers: StringifierMap<{
    number: number;
    boolean: boolean;
}> = {
    number: {
        stringIn: string => {
            const parsed = parseInt(string);
            return isNaN(parsed) ? 0 : parsed;
        },
        stringOut: source => `${source}`,
    },
    boolean: {
        stringIn: string => string !== "" && string !== "false",
        stringOut: source => source === false ? "" : "true",
    },
};

方案二:用包裹函数自动推导类型

如果不想手动声明每个键的类型,可以写一个接受整个对象的函数,让TypeScript自动推导每个属性的泛型,一次性完成校验:

type Stringifier<Source> = {
    stringIn: (string: string) => Source;
    stringOut: (source: Source) => string;
};

// 定义包裹函数,自动推导每个属性的Stringifier类型
function createStringifiers<Map extends Record<string, unknown>>(
    map: { [K in keyof Map]: Stringifier<Map[K]> }
) {
    return map;
}

// 传入整个对象,一次性完成类型检查
const myStringifiers = createStringifiers({
    number: {
        stringIn: string => {
            const parsed = parseInt(string);
            return isNaN(parsed) ? 0 : parsed;
        },
        stringOut: source => `${source}`,
    },
    boolean: {
        stringIn: string => string !== "" && string !== "false",
        stringOut: source => source === false ? "" : "true",
    },
});

这两种方案都能避免为每个条目单独调用检查函数,一次性完成整个对象的类型校验,确保每个Stringifier的stringIn输出和stringOut输入类型严格匹配。方案二更简洁,无需手动声明类型;方案一的类型声明更直观,适合需要明确标注类型的场景。

内容的提问来源于stack exchange,提问作者RobertAKARobin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 03:21:10