簡體   English   中英

如何從 Typescript 中的類元組中提取鑒別器

[英]How to extract discriminator from tuple of classes in Typescript

給定以下代碼:

abstract class Fruit {
  abstract readonly fruitType: string;
}

class Banana extends Fruit {
  readonly fruitType = "banana";
  length = 2;
  color = "yellow";
}

class Pear extends Fruit {
  readonly fruitType = "pear";
  roundness = "very round";
}

class Apple extends Fruit {
  readonly fruitType = "apple";
  fallOfMan = true;
  hasWorms = true;
}

const fruits = [Banana, Pear, Apple] as const;


export type Fruits = typeof fruits[number];


export type FruitTypes = Fruits["fruitType"]; // This should be "banana" | "pear" | "apple"

為什么我無法得到正確的鑒別器聯合?

Heres the playground: https://www.typescriptlang.org/play?#code/IYIwzgLgTsDGEAJYBthjAgYlArgS0QG8BYAKAQVEhngSgFNgATAewDtkBPBAM1wIAqnAA70AXAmp42AcwDcZAL5kyKNBgBCwNtuAJ6ADwj02TDNnxEyFBs3Zde-CENEIAvAgBEIXTs8LyBGQTGQgAC3cEACYAilgWZBYoSM9OemREgHd-JRVSNXQEAAVGZMNjU3MnBBJA21YObj5LF3oU0WAoHLqWHFM2ekKPTwA3eihuKF7TbuVSVVRCgEFhYWD9IxMzLGram0YGh2bBETbh4FXg7ooeYAyAeR4AWW1I6Bx6WIQwtAB1JIAthgPO9Prl5vl2JBHJZgQgANpaHQ6AA0xVKaJWa3oAF1KBh4mxIAE8oZhElEBBTjtYW9TiweDCCGB4WwcACQOMcSSIWSKQgqa4LCdRHDhRAWZ5js5Tp5uQgAPQKhACMJ4DBgMK9ZBMBCcrw+ZHATwIAA+Xg6XTNXgu2M8QA

當我回答時,您的問題是:

// Original code in question
export type FruitTypes = Fruits["name"];

Fruits是構造函數BananaPearApple的類型的聯合——實際的函數,而不是它們產生的實例的類型。 (構造函數) function 的name始終是一個字符串,這就是你最初得到string的原因。 更新后的問題現在出現錯誤,因為這些構造函數沒有fruitType成員。

您可以使用InstanceType獲取您想要的聯合來獲取那些構造函數創建的實例的類型,並使用"fruitType"來訪問這些實例的fruitType成員的類型:

export type FruitTypes = InstanceType<Fruits>["fruitType"];
// −−−−−−−−−−−−−−−−−−−−−−^^^^^^^^^^^^^−−−−−−^^^^^^^^^^^^^^

游樂場鏈接

或者你可以更直接:

export type FruitTypes = (Banana | Pear | Apple)["fruitType"];

...但我猜您出於維護原因試圖避免重復該列表(在上面還有fruits )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM