稿:提供通用的类型、数组vs元组,对数据库的数据

0

的问题

我使用的 mssql 库,它具有这个 interface:

export interface IRecordSet<T> extends Array<T> {
    columns: IColumnMetadata;
    toTable(name?: string): Table;
}

我有一个功能,获取数据库中的数据和返回的一个系列 IRecordSet<T>所以一系列阵列含有一般类型 <T>. 这看起来像:

[[{}, {}, ...], [{}, {}, ...], ...]

import { IRecordSet } from 'mssql'

type Data<T> = Array<IRecordSet<T>>

async function getData (sql: string): Promise<Data<any>> {
  // connect to db, run sql
  return []
}

现在我需要一个功能的电话 getData()我喜欢的类型实际返回的数据,通过提供通用类型 IRecordSet<T>.

我知道这不起作用,但是这是什么我现在:

interface BookData {
  name: string
  author: string
}
interface CarData {
  make: string
  model: string
}

type BooksAndCars = Data<[BookData, CarData]>

async function getBooksAndCars (): Promise<void> {
  const myData: BooksAndCars = await getData(`
    SELECT name, author FROM Books;
    SELECT make, model FROM Cars;
  `)

  const firstBook: BookData = myData[0][0]
  const cars: CarData[] = myData[1]

  // ...
}

稿是说:

  • Type '[BookData, CarData]' is not assignable to type 'BookData'.
  • Type 'IRecordSet<[BookData, CarData]>' is not assignable to type 'CarData[]'.

我了解这些错误,但我不知道如何类型的 myData, firstBook & cars 变量使用的接口定义(BookData & CarData).

应该什么 type BooksAndCars = Data<[BookData, CarData]> 是..?

types typescript
2021-11-23 19:20:57
1

最好的答案

1

它看起来像是你想要的 BooksAndCars 是一个 多元组 的两个要素的不同类型:

type BooksAndCars = [IRecordSet<BookData>, IRecordSet<CarData>];

getData() 功能将返回 Promise<Data<any>>或者一个 Promise<Array<IRecordSet<any>>>. 不幸的是,对你的使用情况,这意味着 myData 将要的类型 Array<IRecordSet<any>>一系列的未知的长在第一和第二元素是无法区分的类型。 它被认为是一类错误稿为你指派这样一个未知的长度均列两件异构tuple,由于编译器不能保证返回阵列已经正好两个元素的权利类型,按正确的顺序。

如果 确定你这么做是安全的,并希望放弃类型检查,通过编译器,可以使用的一 类说法 只是告诉编译器不要担心它:

async function getBooksAndCars(): Promise<void> {
  const myData = await getData(`
    SELECT name, author FROM Books;
    SELECT make, model FROM Cars;
  `) as BooksAndCars

  const firstBook = myData[0][0];
  const cars: CarData[] = myData[1]

  // ...
}

我认为一类型的说法是可能的方式去这里因为 getData()'s返回的类型涉及到 any 类型 所以你已经放弃了类安全保障。 这是不是更糟糕的假设,你得到回元组于它是假设你在找回了一系列的 BookData | CarData. 你必须小心,不管怎样,你sql query真的将回报数据的长度和类型你期望。

如果你有没有真正关心的类型安全,你会写入运行时间代码检查的长度和类型,然后我们可以谈谈如何使编译器认识到你的检查应该 狭窄Promise<Data<object>> (或)来 BooksAndCars. 但我不会走这条路线在这里,因为它的范围之内的问题作为要求。

游乐场链接,以代码

2021-11-24 20:25:18

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................