Arrays 阵列式守卫技巧
目前,为了保护数组类型,我使用了2个函数 贪婪的人:Arrays 阵列式守卫技巧,arrays,typescript,Arrays,Typescript,目前,为了保护数组类型,我使用了2个函数 贪婪的人: export function isPureArrayOf<T>(array: any[], func: Function): array is T[] { for (const item of array) { if (!(item instanceof func)) { return false; } } return true; } 导出函数isPureArrayOf(数组:any
export function isPureArrayOf<T>(array: any[], func: Function): array is T[] {
for (const item of array) {
if (!(item instanceof func)) {
return false;
}
}
return true;
}
导出函数isPureArrayOf(数组:any[],func:function):数组是T[]{
for(数组的常量项){
如果(!(功能的项目实例)){
返回false;
}
}
返回true;
}
而且是不安全的:
export function isArrayOf<T>(array: any[], func: Function): array is T[] {
if (array.length === 0 || array[0] instanceof func) {
return true;
}
return false;
}
导出函数isArrayOf(数组:any[],func:function):数组是T[]{
if(array.length==0 | | array[0]instanceof func){
返回true;
}
返回false;
}
关于这一点,我有两个问题:
是否存在更好的方法来保护数组类型
我可以用某种方式将func链接到泛型T吗?因为目前没有任何东西阻止我写类似于
isPureArrayOf(array,Number)
的东西,这是完全错误的 您的函数是为数组创建类型保护的好方法,我知道没有更好的方法来实现这一点。唯一的改进实际上是将func
与T
绑定的可能性,您需要一个构造函数签名:
function isPureArrayOf<T>(array: any[], func: new ()=>T): array is T[] {
// ...
}
函数isPureArrayOf(数组:any[],func:new()=>T):数组是T[]{
// ...
}
用于记录
我已经更新了接受原语类型的技巧(除了Symbol
):
函数createTestType(func:function){
if(func==Number | | func==String | | func==Boolean){
//原始类型
const expected=func.name.toLowerCase();
返回项目=>typeof项目===预期;
}
return item=>func的item instanceof;
}
导出函数isPureArrayOf(
数组:任意[],
func:new()=>T
):数组为T[]{
const testType=createTestType(func);
for(数组的常量项){
如果(!testType(项目)){
返回false;
}
}
返回true;
}
除非你能更早地执行,否则你必须在速度和正确性之间进行权衡。是的,这就是为什么我要使用两个函数,第一个是当我不控制上游时,第二个是当我只需要让typescript满意时(比如优化联合)。谢谢,这正是我想要的。这实际上消除了在调用guard(isPureArrayOf(array,Class)
而不是isPureArrayOf(array,Class)
)时显式显示泛型的需要,因为后者不太容易出错。@Bastien是的,T
将从构造函数返回类型中推断出来,无需再指定它
function createTestType(func: Function) {
if (func === Number || func === String || func === Boolean) {
// Primitive type
const expected = func.name.toLowerCase();
return item => typeof item === expected;
}
return item => item instanceof func;
}
export function isPureArrayOf<T>(
array: any[],
func: new () => T
): array is T[] {
const testType = createTestType(func);
for (const item of array) {
if (!testType(item)) {
return false;
}
}
return true;
}