因此,我所处的环境有时在camelCase
中引用某些内容,而在snake_case
中有时引用。为了开始对此进行标准化,我编写了一个getField
帮助器,该帮助器首先检查camelCase
,然后检查snake_case
。在这两种情况下,我都可以使用$PropertyType
来获得期望的类型吗?
function toSnakeCase(str: string): string {
return str.replace(/[A-Z]/g, m => `_${m.toLowerCase()}`);
}
function getField<T: {}>(obj: T, field: string) {
return obj[field] || obj[toSnakeCase(field)];
}
// this seems to be typed as `any`, which I don't really understand
(getField({a: true}, 'a'): string); // no error
答案 0 :(得分:0)
不确定我是否正确理解了您的问题。
但是您可以尝试$ElementType,它与$PropertyType
相同,但是允许任何K
,而不仅仅是字符串。因此,您可以添加TFieldName
泛型,即:
function getField<T: {}, TFieldName: $Keys<T>>(obj: T, field: $Keys<T>): $ElementType<T, TFieldName> {
return obj[field] || obj[toSnakeCase(field)];
}
// camelCase type
type User = {
firstName: string,
};
// snake_case type
type UserSK = {
first_name: string,
}
// firstName is string
const firstName = (getField<User & UserSk, 'firstName'>({firstName: 'Lyle' }, 'firstName'));
如果只留下一种类型,即camelCase
-如果为snake_case
调用了该方法,那么流程将响应错误,因此可以帮助您将项目移至仅一种方法。