代码之家  ›  专栏  ›  技术社区  ›  user2024080

元素隐式具有“any”类型,因为类型为“0”的表达式不能用于索引类型为“unknown”

  •  0
  • user2024080  · 技术社区  · 3 年前

    我得到了一个错误:如何概括返回类型?

        Element implicitly has an 'any' type because expression of type '0' can't be used to index type 'unknown'.
      Property '0' does not exist on type 'unknown'.(7053)
    

    ts代码:

    function ReturnFist<Type>(items:Type): Type {
        return items[0]; //error is here
    }
    
    
    const item1 = [1,2,3,4,5];
    const item2 = ['a','b','c'];
    const item3 = [true, false, true, true];
    const item4 = [{name:'one'}, {name:'two'}, {name:'thre'}, {name:'four'}];
    
    const result1 = ReturnFist<number[]>(item1);
    const result2 = ReturnFist<string[]>(item2);
    const result3 = ReturnFist<boolean[]>(item3);
    const result4 = ReturnFist<boolean[]>(item3);
    

    Live Demo

    1 回复  |  直到 3 年前
        1
  •  3
  •   Robby Cornelissen    3 年前

    您需要进一步约束泛型类型参数:

    function ReturnFirst<Type extends Array<any>>(items: Type): Type[number] {
      return items[0];
    }
    

    不过,还有更优雅的写法:

    function ReturnFirst<Type>(items: Type[]): Type {
        return items[0];
    }
    
    
    const item1 = [1, 2, 3, 4, 5];
    const item2 = ['a', 'b', 'c'];
    const item3 = [true, false, true, true];
    const item4 = [{name:'one'}, {name:'two'}, {name:'three'}, {name:'four'}];
    
    const result1 = ReturnFirst(item1);
    const result2 = ReturnFirst(item2);
    const result3 = ReturnFirst(item3);
    const result4 = ReturnFirst(item4);