Tìm kiếm trang web

Định nghĩa kiểu TypeScript cho hàm flatten


Tôi có một hàm flatten đơn giản. Ý tưởng là nó có thể nhận một mảng các chuỗi hoặc mảng các mảng chuỗi và luôn trả về một mảng chuỗi chỉ có 1 cấp độ. Ví dụ:

flatten(['a', ['b']]) // returns ['a', 'b']
flatten(['a', 'b']) // returns ['a', 'b']

Đây là phần triển khai của hàm này

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return [].concat(...arr);
}

Tôi đang gặp lỗi trình biên dịch TypeScript sau:

  error TS2769: No overload matches this call.
    Overload 1 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.
    Overload 2 of 2, '(...items: ConcatArray<never>[]): never[]', gave the following error.
      Argument of type 'string | string[]' is not assignable to parameter of type 'ConcatArray<never>'.
        Type 'string' is not assignable to type 'ConcatArray<never>'.

  105   return [].concat(...arr);
                        ~~~~~~

Làm thế nào tôi có thể định nghĩa các kiểu cho đầu vào và đầu ra của hàm flatten này? Tôi muốn tránh sử dụng kiểu any.

Câu trả lời #1

Tôi đang nghĩ rằng trình biên dịch không thể xác định được kiểu mảng mà giá trị [] định nghĩa. Cách giải quyết dễ nhất ở đây là thông báo cho nó rằng đó là string[] bằng cách xác thực kiểu:

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
   return ([] as string[]).concat(...arr);
}

Hy vọng điều đó hữu ích; chúc may mắn!

Liên kết Playground đến mã

Câu trả lời #2

Bạn phải chỉ định loại cho giá trị trả về, trong trường hợp này, là một mảng các chuỗi.

function flatten(arr: ReadonlyArray<string | string[]>): string[] {
    const output: string[] = [];
    return output.concat(...arr);
}