如何强制只读数组在Typescript中具有字符串文本的元组类型?
我有一个配置对象,如下所示:如何强制只读数组在Typescript中具有字符串文本的元组类型?,typescript,Typescript,我有一个配置对象,如下所示: const config = { envs: ['dev', 'test', 'prod'], targets: ['> 2%'] }; 当前,typescript编译器推断此对象的类型为: type IConfig = { envs: string[], targets: string[] }; 这是有意义的,因为我可能会在声明后的某个时刻对这个数组进行变异 但我不会改变它,所以我希望它是: type IConfig = { envs: ['dev',
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%,但我希望有一种方法可以应用于对象作为一个整体,而不是每个属性。我在示例中添加了另一个属性以使其更清晰。结合:
FTR,有和。可以简化,它们非常有用-感谢你们两位。我认为我对这一点解释得不够好,但我希望有一种方法可以应用于整个对象,而不是每个属性。我在示例中添加了另一个属性,以使其更清晰。属性将始终是字符串数组。道歉!
function asTupleOfLiterals<T extends string, U extends [T, ...T[]]>(tuple: U): U {
return tuple;
}
const config = { envs: asTupleOfLiterals(['dev', 'test', 'prod']) };
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%'] });