타이프 라이터를 제공하는 일반적인 유형,배열에 대 tuple,를 위한 데이터베이스의 데이터

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>>나,또는 동등하게,a Promise<Array<IRecordSet<any>>>. 불행하게도 당신의 사용을 위해 경우,즉 myData 될 것입의 유형 Array<IRecordSet<any>>배열의 알 수 없는 길이 어디에 첫 번째와 두 번째 요소는 구별할 수 없는 형식입니다. 그것은 유형으로 간주됩에 오류가 타이프 라이터에 대한 할당은 알 수 없는 길이 균일한 배열을 두 요소의 유형이 다른 튜플 때문에,컴파일러를 보증할 수 없는 반환되는 array 는 정확히는 두 가지 요소의 유형에 올바른 순서로 정렬됩니다.

는 경우에 당신 은 확신을 안전하고,지내 유형 검사 컴파일러에 의해 사용할 수 있습니다 형 주장 하게 컴파일러에 대해 걱정하지 않다:

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()의 유형을 포함 any 그래서 당신은 이미 포 유형에서 안전을 보장합니다. 그렇지 않은 훨씬 더 나쁘다고 가정하면 다시는 튜플보다 가 당신이 다시의 배열 BookData | CarData. 당신은 조심해야 하는 방식으로 sql 쿼리를 정말로 반품 데이터의 길이와 형식을 기대합니다.

았으면 정말로 걱정형 안전,당신이 쓰는 코드를 런타임을 확인하는 길이 형식,그리고 우리는할 수 있는 방법에 대해 이야기를 컴파일러를 인식하는 귀하의 확인해야 좁고Promise<Data<object>> (또는)하기 BooksAndCars. 하지만 나는 내려가지 않을 것이고 여기 때문에,그것의 범위에 대한 질문에 물었습니다.

놀이터에 대한 링크를 코드

2021-11-24 20:25:18

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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