如何在打字稿中将对象的值引用为泛型?

fig*_*uts 3 typescript

我正在尝试为此函数编写签名:

export function objToArray(obj){
    let ret = [];
    for(const key of Object.keys(obj)){
        ret.push(Object.assign({objKey: key.toString()}, obj[key]));
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)

因此,对于包含 UI 类型值的 T 类型对象,要返回Array<U & {objKey: string}>。我不知道如何用打字稿做到这一点。

jca*_*alz 6

您可以使用索引访问类型。类型T具有 type 的键keyof T和 type 的值T[keyof T]。因此,您的函数将如下所示:

export function objToArray<T extends object>(
 obj: T): Array<T[keyof T] & { objKey: string }>{
    let ret = [];
    // Object.keys() returns `string[]` but we will assert as `Array<keyof T>`
    for(const key of Object.keys(obj) as Array<keyof T>){
        ret.push(Object.assign({objKey: key.toString()}, obj[key]));
    }
    return ret;
}
Run Code Online (Sandbox Code Playgroud)