【问题标题】:TypeScript function that returns value for string literal of property name?为属性名称的字符串文字返回值的 TypeScript 函数?
【发布时间】:2020-08-28 20:27:07
【问题描述】:

考虑这个返回对象属性值的 TypeScript 函数:

export function getProperty<T>(object: T, key: string): any {
    return (object as any)[key]
}

使用起来不是很好,因为它总是返回一个any

interface Animal {
    name: string,
    hungry: boolean,
}

const myHippo: Animal = {
    name: "Hippo",
    hungry: true,
}

const name = getProperty(myHippo, "name") // Returns any, but I want a string.
const size = getProperty(myHippo, "size") // Returns any, but I want a compiler error.

我希望它返回一个正确类型的值,例如string 用于"name",如果key 中提供的字符串文字不是object 的属性,则会导致编译器错误。 (我不需要支持非文字字符串,那些也可能是编译器错误。)

TypeScript 甚至可以做到这一点吗?我怀疑不是,但我不确定。

作为朝着正确方向迈出的一步有用的东西是实用程序类型Keys&lt;T&gt;,它表示T 中作为属性名称的所有字符串文字的联合。但这似乎不存在?

【问题讨论】:

    标签: typescript types key


    【解决方案1】:
    export function getProperty<T, K extends keyof T>(object: T, key: K): T[K] {
      return object[key];
    }
    

    这会给你想要的编译器失败,并且返回类型与属性类型匹配

    Playground Link

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-21
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多