【问题标题】:Element implicitly has 'any' type because type has no index signature元素隐式具有“任何”类型,因为类型没有索引签名
【发布时间】:2018-04-09 06:27:43
【问题描述】:

我正在尝试在 TypeScript 中实现 Maybe.withDefault 之类的东西:

const locale = 'en-US'; //navigator.language
const systemLanguage:Language = withDefault(locale, 'en');


const languages = {en: <'en'>'en', mk: <'mk'>'mk', es: <'es'>'es'};
type Language = keyof typeof languages;


const withDefault = (candidate: string, def: Language): Language =>
  languages[langCandidate] ? languages[langCandidate] : def;

虽然我了解stringLanguage 之间的冲突,但我想知道如何在不更改给我紧密类型的语言结构的情况下解决这个问题。

【问题讨论】:

    标签: typescript types functional-programming typescript2.0


    【解决方案1】:

    您可以通过引入一个可以由Language 或字符串索引的中间类型,并引入一个将languages 隐式转换为该类型的中间函数来做到这一点(转换成功而无需类型转换,因为这些类型是一个-方式兼容):

    const languages = {en: <'en'>'en', mk: <'mk'>'mk', es: <'es'>'es'};
    type Language = keyof typeof languages;
    
    
    type LanguageLookup = {[n in Language | string]: Language};
    
    function languageLookup(language: string, lookup: LanguageLookup): Language | undefined {
        return lookup[language];
    }
    
    const withDefault = (candidate: string, def: Language): Language =>
        languageLookup(candidate, languages) || def;
    

    【讨论】:

    • Thanx mate / Фала братче / Muchas gracias
    猜你喜欢
    • 2018-09-06
    • 2019-05-12
    • 1970-01-01
    • 2017-06-30
    • 2021-08-24
    • 2019-04-01
    • 2019-01-06
    • 2019-10-03
    • 1970-01-01
    相关资源
    最近更新 更多