टाइपप्रति: उपलब्ध कराने के सामान्य प्रकार, सरणी बनाम टपल के लिए, डेटाबेस में डेटा

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>>, एक सरणी के अज्ञात लंबाई जहां पहले और दूसरे तत्वों की पृथक प्रकार के । यह माना जाता है एक प्रकार की त्रुटि में टाइपप्रति आप के लिए आवंटित करने के लिए इस तरह के एक अज्ञात लंबाई सजातीय सरणी के लिए एक दो तत्व विषम टपल के बाद से, संकलक कि गारंटी नहीं दे सकते लौटे सरणी है वास्तव में दो तत्वों की सही प्रकार सही क्रम में.

यदि आप कर रहे हैं यकीन है कि तुम क्या कर रहे हैं सुरक्षित है, और त्यागना करने के लिए चाहते प्रकार की जाँच संकलक द्वारा, आप का उपयोग कर सकते हैं एक प्रकार का दावा करने के लिए बस बता संकलक करने के लिए नहीं इसके बारे में चिंता:

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. आप सावधान रहना है या तो तरीका है कि अपने एसक्यूएल क्वेरी वास्तव में वापस आ जाएगी डेटा की लंबाई और प्रकार आप की उम्मीद है.

यदि आप क्या वास्तव में के बारे में परवाह प्रकार सुरक्षा, आप लिखना चाहते रनटाइम कोड की जांच करने के लिए लंबाई और प्रकार है, और फिर हम बात कर सकते हैं के बारे में कैसे बनाने के लिए संकलक समझते हैं कि अपने चेक करना चाहिए संकीर्ण से Promise<Data<object>> (या कुछ और) के लिए BooksAndCars. लेकिन मैं नीचे नहीं जाना होगा कि मार्ग यहाँ के बाद से, यह के बाहर गुंजाइश के लिए के रूप में सवाल पूछा.

खेल का मैदान के लिए लिंक कोड

2021-11-24 20:25:18

अन्य भाषाओं में

यह पृष्ठ अन्य भाषाओं में है

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

इस श्रेणी में लोकप्रिय

लोकप्रिय सवाल इस श्रेणी में