我可以根据字符串中的字符创建类型吗?

时间:2019-03-27 16:08:44

标签: typescript

我有一个接受2个字符串并将其扩展为完整属性的函数。例如,将用mr返回MarginRightpt然后返回PaddingTop

我的问题是,如何输入这样的函数?基本上,我想将输入字符串的第一个字符限制为mp,将第二个字符限制为rlt或{{ 1}}。到目前为止,我只有b,但这显然会接受比我想要的更多的东西。

1 个答案:

答案 0 :(得分:2)

由于这是数量有限且相对较少的项目,因此您可以使用重载,也可以使用接口将输入字符串映射到输出类型并在函数签名中使用它:

interface Abbreviations {
    "mr" : "MarginRight"
    "pr" : "PaddingRight"
    // and the rest 
}
function expand<K extends keyof Abbreviations>(k: K): Abbreviations[K] {
    return null!;
}

expand("mr") // retruns MarginRight
expand("SS") // error

如果您还没有实现,您也可以使用缩写形式并使用对象的类型。

function withLiterals<
    T extends Record<string, V>, 
    V extends string | boolean | number | symbol | null | undefined | Record<string, V>
>(input: T ): T { return input }
const abbreviations = withLiterals({
    "mr" : "MarginRight",
    "pr" : "PaddingRight"
    // and the rest 
})
function expand<K extends keyof typeof abbreviations>(k: K): typeof abbreviations[K] {
    return null!;
}

expand("mr") // retruns MarginRight
expand("SS") // error