Array type in type script

后端 未结 3 434
一个人的身影
一个人的身影 2021-01-14 03:11

Why is this allowed by TypeScript? I specified a numeric index. Why can I use a string as an index? Visual studio doesn\'t report an error.

interface StringA         


        
相关标签:
3条回答
  • 2021-01-14 03:40

    Problem

    It's because the compiler is still allowing implicit any types which can happen when accessing a property of an object by using an index:

    // Example 1
    let dictionary: { [index: number]: string };
    let myStringTypedVar = dictionary[5];   // implicitly typed as "string"
    let myAnyTypedVar = dictionary["prop"]; // implicitly typed as "any"
    
    // Example 2
    let myNumberTypedVar = 5;
    let myAnyTypedVar = myNumberTypedVar["prop"]; // implicitly typed as "any"
    

    Fix: Compile with --noImplictAny

    If you compile your example with --noImplictAny then it will error:

    tsc --noImplicitAny example.ts
    

    Outputs:

    example.ts(8,9): error TS7017: Index signature of object type implicitly has an 'any' type.

    I would recommend always compiling with --noImplicitAny. In Visual Studio, you can turn on --noImplictAny by unchecking "Allow implicit 'any' types" in the project properties' typescript build tab:

    Or by adding "noImplicitAny": "true" to compilerOptions in tsconfig.json.

    0 讨论(0)
  • 2021-01-14 03:44

    An array is also an objects. So you can access the object properties.

    var array = [];
    array.push("One"); // array
    array[1]= "Two"; // array
    array['key'] = "Three";// object
    array.key2 = "Four"; // object
    var length = array.length; // Is 2 
    
    0 讨论(0)
  • 2021-01-14 03:54

    A numeric index signature only defines the type for properties accessed through a numeric index. It does not restrict property access to only a numeric index.

    From the TypeScript 1.5 specification:

    Numeric index signatures, specified using index type number, define type constraints for all numerically named properties in the containing type. Specifically, in a type with a numeric index signature of type T, all numerically named properties must have types that are assignable to T

    But, I think you have a good point. It does seem like properties should not be accessed by a string index if you have only defined a numeric index signature.

    0 讨论(0)
提交回复
热议问题