目前为了保护阵列类型,我使用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;
}
一个不安全的人:
export function isArrayOf<T>(array: any[], func: Function): array is T[] {
if (array.length === 0 || array[0] instanceof func) {
return true;
}
return false;
}
我有两个问题:
是否有更好的方法来保护数组类型?
我可以将func链接到通用T吗?因为目前没有什么能阻止我写出像isPureArrayOf<String>(array, Number)
那样完全错误的东西。
答案 0 :(得分:3)
您的函数是为数组创建类型保护的好方法,我知道没有更好的方法来实现这一点。唯一的改进确实是将func
绑定到需要构造函数签名的T
的可能性:
function isPureArrayOf<T>(array: any[], func: new ()=>T): array is T[] {
// ...
}
答案 1 :(得分:0)
记录。
我已经更新了接受基本类型的技巧(Symbol
除外):
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;
}