首页 > 解决方案 > 函数中动态构造对象的窄返回类型

问题描述

我有以下构造函数

function make(x: string) {
     const result: { [k: string]: any } = {};
     result[x] = true
     result.kind = x
     return result
}

使用如下

let a = make("A")

将创建一个“类型”的对象

{
    A: true,
    kind: "A"
}

当与“B”一起使用时

let b = make("B")

将创建一个“类型”的对象

{
    B: true,
    kind: "B"
}

现在两者ab都将是any没有类型签名的类型。但是,我希望有一个比任何返回类型都更具体的返回类型。类似的东西

function make(x: string): { $x-val: bool; kind: $x-val } { ....

这有可能吗?

标签: typescript

解决方案


以下类型描述可以解决问题

type TT<X extends string> = 
    (Record<X, true> & Record<"kind", X>) extends infer O ? 
    { [P in keyof O]: O[P] } : 
    never

function make<T extends string>(x: T): TT<T> {
    const result: { [k: string]: any } = {};
    result[x] = true
    result.kind = x
    return result as TT<T>
}

推荐阅读