通过数组扩展TypeScript中的只读元组类型

通过数组扩展TypeScript中的只读元组类型,typescript,extension-methods,readonly,Typescript,Extension Methods,Readonly,假设我有Color类型的定义以及可接受的字符串值: const COLORS = ["Q", "R", "G", "B"] as const; type Color = typeof COLORS[number]; // "Q" | "R" | "G" | "B" 当然,COLORS的支持类型是JavaScript数组。我对数组的includes方法使用polyfill,在TypeScript中声明如下: interface Array<T> { includes(memb

假设我有
Color
类型的定义以及可接受的字符串值:

const COLORS = ["Q", "R", "G", "B"] as const;
type Color = typeof COLORS[number]; // "Q" | "R" | "G" | "B"
当然,
COLORS
的支持类型是JavaScript数组。我对数组的
includes
方法使用polyfill,在TypeScript中声明如下:

interface Array<T> {
    includes(member: T, fromIndex?: number): boolean
}
接口数组{
包括(成员:T,fromIndex?:编号):布尔值
}

现在,我明白了为什么
includes
COLORS
实例上没有被识别为可用-
COLORS
readonly
,并且
includes
声明中的任何内容都不能确保它不会变异任何内容。但是,是否有方法声明此
包含
方法,以便在
const
/
只读
元组上可用?

总结上述注释:

您的const断言
as const
创建了一个
ReadonlyArray
类型,除了声明的
数组
接口外,它还有自己的类型定义。因此,您还可以为
ReadonlyArray
添加全局增强:

interface ReadonlyArray<T> {
    includes(searchElement: T, fromIndex?: number): boolean;
}
对于target
ES5
,您可以相应地扩展tsconfig.json:

{
  "compilerOptions": {
    "target": "es5" ,
    // add es2016.array.include 
    "lib": ["es5", "dom", "scripthost", "es2016.array.include"]
    // ...
  }
}

PS:TypeScript lib声明可以找到,或者只要在VS代码中按ctrl键点击类型,如果你想查找它们。

实际上包含可以与只读数组一起使用!它在TS
lib.es2016.d.TS
ReadonlyArray
界面中定义。您在tsconfig.json中设置了哪个目标,您是否调整了
lib
条目?是的,我实际上是有意将ES5作为目标的。但实际上我发现我可以用
ReadonlyArray
而不是
Array
编写相同的接口声明。是的,polyfill可能缺少只读数组类型。同样有效的方法:您可以在tsconfig.json编译器选项中指定
lib
属性以包括“es2016.array.include”,它为
ReadonlyArray
提供类型<代码>“目标”:“es5”,“lib:[“es5”,“dom”,“scripthost”,“es2016.array.include”]
哇,我不知道
“es2016.array.include”
可以列为lib!我在哪里可以找到大型图书馆如此详细的子部分列表?好的,但即使这样,我还是希望将扩展的
接口
声明保持在同一个文件中,靠近polyfill,以确保不会突然得到一个而没有另一个。您可以查看的
lib
条目中的所有库配置。这正是出于您的目的,您可以
瞄准一个较旧的ES版本,但使用一些“较新”的ES库,这些库由一些polyfill填充。当然,您也可以自己编写全局增广,如果只有一种方法,如
array.prototype.includes
(或者使用polyfill内置的打字,如果存在的话)。
{
  "compilerOptions": {
    "target": "es5" ,
    // add es2016.array.include 
    "lib": ["es5", "dom", "scripthost", "es2016.array.include"]
    // ...
  }
}