2017-08-21 53 views
1

這裏是我的代碼(以打字稿2.3.4):精確,打字稿在接口多類型的值:

type TokenType = "operator" | "doubleQuote" | "identifier" | "(end)"; 



interface Token { 
    type: TokenType; 
    value: string; 
    pos: number; 
} 

interface PosTokenOp { 
    type: "operator" | TokenType ; 
    value: string; 
    pos: number; 
    left: Token | null; 
    right: Token | null; 
} 

所以我想這PostTokenOp類型將只是:

interface PosTokenOp { 
    type: "operator" ; 
    value: string; 
    pos: number; 
    left: Token | null; 
    right: Token | null; 
} 

但是,如果我只把「運營商」它不認識到它是TokenType的一部分,我在我的代碼中有錯誤。

所以我想使PostTokenOp的類型等於「運營商」,並確切地說,該運營商是TokenType的價值之一。

如果任何人有任何想法如何做到這一點。

感謝和問候

+0

你是什麼意思它不「承認它的TokenType的一部分」?這在2.3.3的[Playground](https://www.typescriptlang.org/play/)中適用於我:'declare let posTokenOp:PosTokenOp;讓令牌:Token = posTokenOp;'所以TypeScript當然確實意識到'PosTokenOp'是一個'Token'。另外,爲什麼你不能只聲明'接口PosTokenOps擴展令牌'?你能否提供更多信息讓別人重現你的問題?我也懷疑你需要枚舉來解決它,儘管你接受了這個答案。 – jcalz

回答

1

如果你可以升級到2.4打字原稿您可以使用String Enums

例如

enum TokenType{"operator", "doubleQuote", "identifier", "(end)"} 

interface Token { 
    type: TokenType; 
    value: string; 
    pos: number; 
} 

interface PosTokenOp { 
    type: TokenType.operator ; 
    value: string; 
    pos: number; 
    left: Token | null; 
    right: Token | null; 
} 

在2.4之前,你可以使用正常的Enums例如

enum TokenType { operator, doubleQuote ,identifier , end} 

interface Token { 
    type: TokenType; 
    value: string; 
    pos: number; 
} 

interface PosTokenOp { 
    type: TokenType.operator; 
} 

和使用是這個樣子,然後

test:PosTokenOp = { 
     type: TokenType.operator 
    } 
console.log(TokenType[this.test.type]); 
+0

@thanks但是我在打字稿2.3.4中:/ – user462794

+0

@ user462794查看2.4以下版本的解決方案。但是這次你不能使用'(end)' - 只有'end'。 –