2017-08-21 7 views
2

私は列挙の整数値を使用し、の一つは列挙のキーを使用してそのうちの一つ活字体中の2つのインターフェースがあります。私はasNumbersを実装するオブジェクトを取得し、実装するオブジェクトに変換したいTypescript列挙型の整数をキーの和集合の型としてそのキー値に変換するにはどうすればよいですか?

enum foo { 
    bar = 0, 
    baz, 
} 

interface asNumbers { 
    qux: foo 
} 

interface asStrings { 
    quux: keyof typeof foo 
} 

asStrings

const numberObject: asNumbers = { 
    qux: foo.bar 
} 

const stringyObject: asStrings = { 
    quux: foo[numberObject.qux] 
} 

私もstringyObject割り当てにかかわらず、次のエラーが表示されます。私は、次のコードを持っています。

Type '{ quux: string; }' is not assignable to type 'asStrings'. 
Types of property 'quux' are incompatible. 
Type 'string' is not assignable to type '"bar" | "baz"'. 

私がその整数値を取り、それが(より一般的なstring種類に頼らずに)タイプセーフな方法で重要だに変換することができますどのように私には不明です。また、ユースケース満たしながらあなたには、いくつかの型の安全性を提供して関数を定義することができTypescript playground link

答えて

0

:typescriptです遊び場で再現

const stringyObject: asStrings = { 
    quux: getFooProp[numberObject.qux] 
} 

function getFooProp(i: foo): (keyof typeof foo) { 
    return foo[i] as (keyof typeof foo); 
} 

を使用すると、より一般的になりたかった場合は、このような関数を定義することができます:

interface NumericEnum { 
    [id: number]: string 
} 

function getEnumProp<T extends NumericEnum, K extends keyof T>(
    e: T, 
    i: T[K]): (keyof T) { 

    return e[i] as (keyof T); 
} 

コンパイラは両方のケースで私たちを助け、私たちはタイプfooのない列挙型の値を渡したときに文句を言うでしょう。

// Works 
getEnumProp(foo, foo.bar); 

// Argument of type 'foo2.bar' 
// is not assignable to parameter of type 'foo'. 
getEnumProp(foo, foo2.bar); 

Here is a Fiddle for youこれらの両方を示す。

関連する問題