【问题标题】:Extract type from nested parameter从嵌套参数中提取类型
【发布时间】:2021-08-28 01:31:33
【问题描述】:

我想在返回类型中使用函数参数的值。

考虑以下函数:

export function trackKeys(node: HTMLElement, { names }: {
    names: string[];
}) {
    const methods: { [k in typeof names[number]]: (e: Event) => void } = names.reduce((obj, name) => {
        return {
            ...obj,
            [name]: (e: Event) => {
                // Do something
            },
        };
    }, {});
}

这里,“方法”的类型为{ [k in typeof names[number]]: (e: Event) => void },本质上变成了“字符串”。我想从提供给函数的“名称”参数中提取对象键。所以它会是这样的:
{ [k in "john"|"david"|"henry"]: (e: Event) => void } 如果函数被称为trackKeys(node, {names: ["john", "henry", "david"]});

一个例子:

const obj = trackKeys(node, {names: ["apple", "potato"]});
//Expected type {"apple":(e: Event) => void, "potato":(e: Event) => void};

【问题讨论】:

    标签: typescript typescript-generics


    【解决方案1】:

    您需要一个泛型并将数组作为const 传递,因此它的值作为类型的一部分是固定的。

    export function trackKeys<N extends readonly string[]>(
        node: HTMLElement,
        { names }: { names: N },
    ) {
        const methods = names.reduce((obj, name) => {
            return {
                ...obj,
                [name]: (e: Event) => {
                    // Do something
                },
            };
        }, {});
    
        return methods as { [k in N[number]]: (e: Event) => void };
    }
    
    const obj = trackKeys(node, { names: ["apple", "potato"] as const });
    

    【讨论】:

    • 嘿!谢谢。不幸的是,我需要签名是{名称}而不仅仅是名称,因为旁边可能还有其他参数,例如{名称,值,...}。让我看看能否找到解决您签名问题的方法。
    • { 名称:N; } 而不是 { 名称:字符串 []; } 解决了这个问题。好吧不是太难。感谢您指出正确的方向。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    • 2020-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多