【问题标题】:Extending type of function argument扩展函数参数的类型
【发布时间】:2021-02-03 15:06:53
【问题描述】:

我的功能如下:

async paginate(
    msg: Message,
    title: string,
    data: Array<any>,
    message: (
      currentData: any,
    ) => Promise<string | { title: string; description: string }>,
    perPage = 10,
  ): Promise<void> {
      // Function code here
  }

我无法确定data的类型,可以是任意类型的数组。

我想让currentData 与第二个参数中提供的data 具有相同的类型。 例如,如果我提供的data 是一个字符串数组,那么currentData 应该有一个字符串类型,而不是任何类型。

【问题讨论】:

    标签: typescript


    【解决方案1】:

    你想在这里使用generics

    async paginate<T>(
        msg: Message,
        title: string,
        data: Array<T>,
        message: (
          currentData: T,
        ) => Promise<string | { title: string; description: string }>,
        perPage = 10,
      ): Promise<void> {
          // Function code here
      }
    

    本质上,这告诉 Typescript data 是一个 T 类型的数组,并且 message 接受一个名为 currentData 的参数,该参数也具有 T 类型,其中 T 类型将在稍后决定在函数调用期间。所以,如果你的数据类型是string,你可以这样称呼它:

    paginate<string>(
     // parameters
    )
    

    当数据很复杂时,比如 Person 类型定义为 type Person = {name: string, age: number},您可以使用新的类型参数调用相同的函数,如下所示:

    paginate<Person>(
    ...
    )
    

    您的datacurrentData 将针对Person 类型进行验证。

    这是一个简短的例子

    type Message = number;
    function paginate<T>(
        msg: Message,
        title: string,
        data: Array<T>,
        message: (
          currentData: T,
        ) => Promise<string | { title: string; description: string }>,
        perPage = 10,
      ): Promise<void> {
        return Promise.resolve();
      }
    
    // OK
    paginate(1, '123', [1,2,3], (a: number) => Promise.resolve('something'));
    // OK
    paginate(1, '123', ['a','2','3'], (a: string) => Promise.resolve('something'));
    
    // Error
    paginate(1, '123', ['a','2','3'], (a: number) => Promise.resolve('something'));
    // Error
    paginate(1, '123', [1,2,3], (a: string) => Promise.resolve('something'));
    

    TSPlayground link

    【讨论】:

      猜你喜欢
      • 2012-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-24
      相关资源
      最近更新 更多