我正在写一些东西,我需要在给定的类型上获取属性的类型:
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
值。
答案 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