【问题标题】:Typescript Generic type not assignable error打字稿通用类型不可分配错误
【发布时间】:2018-08-01 23:24:23
【问题描述】:

试图创建一个泛型但它显示错误:类型“用户[]”不可分配给类型 T[] 无法理解这样做有什么问题-

interface User {
    name: string,
    age: number
}

interface Movie {
    title: string,
    language: string
}

function getItems<T>(arg: number|string): T[] {
    let useList: User[] = [];
    let movieList: Movie[] = [];
    if (typeof arg == 'string') {
        return useList;
    } else {
        return movieList;
    }
}

var a: User[] = getItems<User>('user_list');

【问题讨论】:

  • 返回两个不同接口类型的数组只是为了演示。我只想制作一个通用函数,说我可以传递一些参数,并且它应该能够按预期返回“任何”类型的数据。如果我必须使用函数重载,那么我很困惑打字稿中泛型的优势是什么。正如定义天通过添加 或其他东西使方法通用。
  • 另外,当我悬停函数调用时,它会正确显示返回类型(正如提及 所预期的那样)

标签: typescript


【解决方案1】:

问题是你的函数并不是真正的通用。使用泛型参数时,您不能返回特定类型,您需要尊重传递给您的泛型参数。一个可以做你想做的函数签名将是一个使用重载的函数签名

function getItems(arg: string): User[] 
function getItems(arg: number): Movie []  
function getItems(arg: number|string): User[] | Movie []  {
    let useList: User[] = [];
    let movieList: Movie[] = [];
    if (typeof arg == 'string') {
         return useList;
    } else {
         return movieList;
   }
}

【讨论】:

    【解决方案2】:

    您应该为您的案例使用函数重载而不是泛​​型。

    请注意,带有实现的函数的签名将被编译器隐藏。

    function getItems(arg: string): User[];
    function getItems(arg: number): Movie[];
    function getItems(arg: number | string) {
        let useList: User[] = [];
        let movieList: Movie[] = [];
        if (typeof arg == 'string') {
            return useList;
        } else {
            return movieList;
        }
    }
    
    var a = getItems('user_list');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      • 2018-02-02
      • 2021-06-17
      • 2022-06-15
      • 2018-09-29
      • 1970-01-01
      相关资源
      最近更新 更多