有什么方法可以通过字符串操作来键入字段?

时间:2018-11-20 12:22:22

标签: javascript flowtype

因此,我所处的环境有时在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

1 个答案:

答案 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调用了该方法,那么流程将响应错误,因此可以帮助您将项目移至仅一种方法。

try