【问题标题】:How to force read-only arrays to have a tuple type with string literals in Typescript?如何强制只读数组在 Typescript 中具有带有字符串文字的元组类型?
【发布时间】:2018-09-24 12:55:27
【问题描述】:

我有一个配置对象如下:

const config = { envs: ['dev', 'test', 'prod'], targets: ['> 2%'] };

目前,typescript 编译器推断此对象的类型为:

type IConfig = { envs: string[], targets: string[] };

这是有道理的,因为我可能会在声明后的某个时候改变这个数组。

我不会改变它,所以我希望它是:

type IConfig = { envs: ['dev', 'test', 'prod'], targets: ['> 2%'] };

有没有办法告诉编译器将config.envs 的类型推断为带有字符串文字的元组类型(无需输入)?

编辑:最好的答案是 90%,但我希望有一种方法可以应用于整个对象而不是每个属性。我在示例中添加了另一个属性以使这一点更清楚。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    结合the standard trick to infer literal typesa trick I just learned to infer a tuple type rather than an array type

    function asTupleOfLiterals<T extends string, U extends [T, ...T[]]>(tuple: U): U {
        return tuple;
    }
    const config = { envs: asTupleOfLiterals(['dev', 'test', 'prod']) };
    

    第 2 轮:应用于具有多个元组值属性的对象

    奇迹般地,如果我们只是将 [T, ...T[]] 包装在一个带有索引签名的对象中,上下文类型似乎可以工作:

    function asObjectOfTuplesOfLiterals<T extends string,
        U extends {[n: string]: [T, ...T[]]}>(obj: U): U { return obj; }
    
    const config = asObjectOfTuplesOfLiterals(
        { envs: ['dev', 'test', 'prod'], targets: ['> 2%'] });
    

    FTR,有an open suggestion to make it easier to infer literal typesone to make it easier to infer tuple types

    【讨论】:

    • 可以简化为bit
    • 这些非常有用 - 感谢你们俩。我认为我解释得不够好,但我希望有一种方法可以应用于整个对象而不是每个属性。我在示例中添加了另一个属性以使这一点更清楚。属性将始终是字符串数组。道歉!
    猜你喜欢
    • 2019-07-06
    • 1970-01-01
    • 2017-11-13
    • 2023-01-30
    • 2015-09-19
    • 1970-01-01
    • 2014-06-01
    • 1970-01-01
    • 2020-12-11
    相关资源
    最近更新 更多