【问题标题】:Generic type of object value parameter对象值参数的通用类型
【发布时间】:2016-12-28 03:51:26
【问题描述】:
function getValues<T, U extends { [key: string]: T }>(object: U): T[] {
    // ...
}

const test = { a: 123, b: 234 };
const values = getValues(test);

在上面的代码中,我希望values 的类型是number[],但实际的类型是{}[]

我做错了什么?

【问题讨论】:

    标签: generics typescript types typescript2.0


    【解决方案1】:

    { a: 123, b: 234 } 对象的类型是:

    { a: number; b: number; }
    

    不是

    { [key: string]: number }
    

    你可以这样做:

    const test = { "a": 123, "b": 234 } as { [key: string]: number };
    

    告诉编译器它确实是你想要的。
    但是即使那样你仍然不会得到你想要的values的类型:

    const values = getValues(test); // type of values {}[]
    

    你应该这样做:

    function getValues<T>(object: { [key: string]: T }): T[] {
        return null;
    }
    
    const test = { "a": 123, "b": 234 } as { [key: string]: number };
    const values = getValues(test);
    

    (code in playground)

    【讨论】:

    • 太好了,谢谢,这行得通。 test 不需要强制转换为 { [key: string]: number },因为 TypeScript 2 推断所有值都是 number 类型并且正确匹配函数的签名。您的示例将在没有 TypeScript 2 中的演员的情况下工作。
    • 对。不知道您使用的是 typescript 2,但我很高兴您可以删除丑陋的断言。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-30
    • 1970-01-01
    • 2011-06-16
    相关资源
    最近更新 更多