从泛型类型获取属性的类型

时间:2019-09-29 15:29:47

标签: typescript typescript-generics

我正在写一些东西,我需要在给定的类型上获取属性的类型:

type FooBarType {
    foo: string,
    bar: number
}

该函数看起来像这样:getType<K extends keyof T>(key: K): string,并且以foo作为参数调用该函数的输出为string

getType<FooBarType>('foo' as as keyof FooBarType) // string

我现在还没有通用的实现,所以似乎使用索引访问类型了吗?

这可能吗?

到目前为止,我有这个:

getType <K extends keyof T>(key: K): string {
    type property = T[keyof T]
    // not sure how to continue here as I can't use T as a value
}

MWE:

type Config {
    database_host: string,
    database_pass: string | undefined,
}

const defaultConfig: Config = {
    database_host: 'host',
    database_pass: undefined
}

const config = ConfigBuilder<Config>.resolve(defaultConfig, new EnvironmentVars(), new YamlFiles(['../path/to/yaml']))

class ConfigBuilder<T> {

   public resolve(...): T {
     // from default: key: string
     const configKey: keyof ConfigType = key as keyof ConfigType
     if (foundValues.hasOwnProperty(key.toUpperCase())) {
            config[configKey] = this.parse(configKey, foundValues[key]) 
     }
   }

   private parse<K extends keyof ConfigType>(key: K, value: any): ConfigType[K] {
        const type = this.getConfigKeyType(key)

        if (this.parserDictionary[type]) {
            return this.parserDictionary[type].parse(value)
        }

        throw Error(`Could not find parser for type ${type}`)
    }

    private getConfigKeyType<K extends keyof ConfigType>(key: K): string {
        type configItems = ConfigType[keyof ConfigType]

    }

}

// config {
//     database_host: 'host',
//     database_pass: 'pass'    
// }

env中的一个,或一个都不。 vars或解析的文件可以提供database_pass值。

1 个答案:

答案 0 :(得分:0)

如评论中所述,您已经可以使用FooBarType['foo']来做到这一点。

如果要以编程方式输入,请输入:

interface FooBarType {
    foo: string;
    bar: number;
}

const obj: FooBarType = {
   foo: '',
   bar: 1
}

function getValue<T, K extends keyof T>(obj: T, key: K): T[K] {
   return obj[key];
}

getValue(obj, 'foo'); // return string value
getValue(obj, 'bar'); // return number value