TypeScript keyof和Indexer兼容性?

时间:2017-05-23 09:06:45

标签: typescript

我有一个方法签名,期望第二个参数为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 ...

没有人在工作。

1 个答案:

答案 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<...>lengthtoStringpush等。数字索引不属于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,因为数字具有最大值和最小值。