我只是在找乐子,用C#制作类似于LINQ的库。我正在尝试创建ofType()
方法,该方法过滤现有列表并仅返回与指定类型匹配的数组。
到目前为止我所拥有的:
export class JSLinqArray<T> extends Array<T> {
constructor(arr?: Array<T>) {
super(...arr);
}
ofType = <U>(type: U): JSLinqArray<U> => {
const output = new JSLinqArray<U>();
for (let i = 0; i < this.length; i++) {
if (this[i] instanceof type) {
output.push(<any>this[i]);
}
}
return output;
}
toArray = function (): T[] {
const temp: T[] = [];
for (let i = 0; i < this.length; i++) {
temp.push(this[i]);
}
return temp;
}
}
const mixedArr = new JSLinqArray<string | number>(['test1', 1, 2, 'test2']);
const test = mixedArr.ofType(String);
console.log(test.toArray());
如何通过String
方法传递Number
或CustomClass
甚至是ofType
泛型类型引用,以便可以正确地使用instanceof
比较?
现在,故障点在ofType
方法中的if语句处。 The right-hand side of an 'instanceof' expression must be of type 'any' or of a type assignable to the 'Function' interface type.
答案 0 :(得分:2)
我对答案没有100%的信心,因此可以免责。
我可以看到的一个问题是javascript load Data.mat;
[C,U] = fcm(Data,2);
figure
hold on
for i=1:2
plot(Data(index{i},1),Data(index{i},2),'o')
plot(C(i,1),C(i,2),'xk','MarkerSize',15,'LineWidth',3)
end
hold off
类型与原始Number
类型不同。 number
和String
也不相同。
因此,将不可能传递数字,并且期望Number的实例。
答案 1 :(得分:1)
instanceof
在JavaScript中用于类型检查是不可靠的。
更改
if (this[i] instanceof type)
收件人
if (this[i].constructor === type)
之所以起作用,是因为它将迫使运行时将原始值强制转换为Object类型。构造函数将正确匹配。