Simplifying typescript ประเภทในประเภทหน้าต่างผุด

0

คำถาม

มันจะเป็นไปได้ simplify คนประเภทนั้นคือการแสดงในคนประเภท-ทูลทิปนั่นมันเห็นได้ตอนที่ฉันเมาส์อยู่เหนือไปเป็นตัวแปรใน Typescript?

ฉันต้องทำตามรหัส:

type Debug<T> = {
    [key in keyof T]: T[key]
}

type Chainable<Acc = {}> = {
    option: <K extends string, V>(key: K, value: V) => Chainable<Acc & {[k in K]: V}>;
    get: () => Debug<Acc>;
}

declare const config: Chainable
const result = config
  .option('foo', 123)
  .option('name', 'type-challenges')
  .option('bar', { value: 'Hello World' })
  .get()


type X = typeof result;

ตอนที่ฉันเมาส์อยู่เหนือมา result ตัวแปรอฉันได้: [hovering over result variable 1

อย่างไรก็ตามตอนที่ฉันเมาส์อยู่เหนือมา type X ฉันเห็น: hovering over a typeof result

คำถาม:

  1. ทำไมพวกนั้นประเภทการแสดงที่แตกต่างไปไหม? (แม้ว่าพวกเขาเป็นตัวแทนแบบเดียวกัน)
  2. มันมีทางที่จะแสดงประเภทเหมือนมันแสดงในคนที่สองหน้าจอ?

สนามเด็กเล่น

types typescript
2021-11-23 22:28:22
3

คำตอบที่ดีที่สุด

1

คุณสามารถ\ทำอะไรบางอย่างเหมือน:

type Chainable<Acc = {}> = {
    option: <K extends string, V>(key: K, value: V) => Chainable<{[k in K | keyof Acc]: k extends keyof Acc ? Acc[k] : V}>;
    get: () => Debug<Acc>;
}

ง่ายๆก็คือนี่คือการทำในสิ่งเดียวกันเป็นสิ่งที่คุณกำลังทำอยู่แต่ในกรเรื่องทางแล้ว

แทนที่จะต้องพึ่ง & พารามิเตอร์ซึ่งจะ pollute งเมาส์อยู่เหนือห้ามใบ้กันโอเค้? คุณสามารถสร้างโฮปขึ้นมาใหม่อีกครั้ทั้งวัตถุด้วยความยากลำบาก

นี่คือประสบความสำเร็จโดยการใช้ k in K | keyof Acc เป็นกุญแจสำคัญแต่มันก็ยังหมายความว่าคุณต้องการเป็นเงื่อนไขเซลประเภทสำหรับค่า.

ฉันคิดว่านี่อาจน้อยกว่า performant แต่บอกตามตรงฉันไม่คิดว่ามันจะทำให้มากที่สุดต่างกัน

สนามเด็กเล่น

2021-11-24 03:11:45
0

นี่เป็นตัวหลักของเห็นความแตกต่าง..ระหว่าง type คำค้นและคน interface คำค้น. ส่วนติดต่อชื่อปรากฎในทูลทิปแต่ชนิดชื่อทำไม่ได้

2021-11-24 03:36:18
0

มันดูเหมือนว่ามันเป็นไปได้ที่จะสร้างเครื่องมืออรรถประโยชน์ประเภทที่จะทำอย่างที่ flattening โดยอัตโนมัติ ดังนั้นนั่นคือไม่จำเป็นต้องเจาะคนประเภทที่ทาง@zecuria ทำ

type Chainable<Acc = {}> = {
    option: <K extends string, V>(key: K, value: V) => Chainable<Acc & {[k in K]: V}>;
    get: () => Util_FlatType<Acc>;
}

type Util_FlatType<T> = T extends object ? { [K in keyof T]: Util_FlatType<T[K]> } : T

enter image description here

Util_FlatType คืกขโมยไปจาก ที่นี่

2021-11-28 15:00:21

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

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

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่