我有一个方法签名,期望第二个参数为keyof Array<...>
。
由于Array
接口定义了一个索引器[n: number]: T;
,我希望能够在某种方法中引用该方法中的某个索引。
但我找不到怎么样。 我尝试了以下方法:
MyMethod(myArray, 0); // Argument of type '0' is not assignable to parameter of type ...
MyMethod(myArray, [0]); // Argument of type 'number[]' is not assignable to parameter of type ...
MyMethod(myArray, '0'); // Argument of type '"0"' is not assignable to parameter of type ...
MyMethod(myArray, '[0]'); // Argument of type '"[0]"' is not assignable to parameter of type ...
没有人在工作。
答案 0 :(得分:2)
你总是可以尝试:
- (MKAnnotationView *)mapView:(MKMapView *)mapView viewForAnnotation:(id <MKAnnotation>)annotation{
if (![annotation isKindOfClass:[CustomPointAnnotation class]])
return nil;
NSString *reuseId = @"test";
MKAnnotationView *anView = (MKAnnotationView*)[mapView dequeueReusableAnnotationViewWithIdentifier:reuseId];
if (anView == nil) {
anView = [[MKAnnotationView alloc] initWithAnnotation:point reuseIdentifier:reuseId];
anView.canShowCallout = NO;
}
else
{
anView.annotation = annotation;
}
//Set annotation-specific properties **AFTER**
//the view is dequeued or created...
CustomPointAnnotation *cpa = (CustomPointAnnotation *)annotation;
anView.image = [UIImage imageNamed:cpa.imageName];
return anView;
}
// show route from source to destination
- (MKOverlayRenderer *)mapView:(MKMapView *)mapView rendererForOverlay:(id<MKOverlay>)overlay
{
if ([overlay isKindOfClass:[MKPolyline class]])
{
MKPolylineRenderer *renderer = [[MKPolylineRenderer alloc] initWithPolyline:overlay];
renderer.strokeColor = [[UIColor redColor] colorWithAlphaComponent:0.7];
renderer.lineWidth = 4;
return renderer;
}
return nil;
}
function myFun<T>(arr: Array<T>, index: number) {
return arr[index];
}
是指数组的所有属性名称,例如keyof Array<...>
,length
,toString
,push
等。数字索引不属于pop
界面采用相同的方式,因为它们是lookup type:
Array
考虑一个更简单的界面:
interface Array<T> {
length: number;
toString(): string;
... etc ...
[n: number]: T;
}
这实际上是语言的缺点。另请参阅this issue on GitHub:
我们无法列出所有这些数字字符串文字(有效)。
interface Arr<T> { [n: number]: T; } const variable: keyof Arr<number>; // variable is of type "never"
将keyof Container<T>
与number | numericString
作为所有数字字符串文字的类型,并具有相应的数字文字。numericString
不正确,因为并非每个number | string
都是string
。此外,并非每个字符串的数字字符序列都是numericString
,因为数字具有最大值和最小值。