2017-12-01 16 views
0

両方数宣言オプションのプロパティ例:あなたが持つことができるオブジェクトを入力するにはどうすればよい

{hello?: string, moo?: boolean}

だけでなく、カスタムプロパティ(その機能)、例えばなければなりません:

[custom: string]: (v?: any) => boolean

これは私が例えば見たいものです:

const myBasic: Example = {moo: false} 
// -> ✅ Valid! Using known keys 

const myValid: Example = {hello: 'world', customYo:() => true} 
// -> ✅ Valid! "customYo" is a function returning a bool. Good job! 

const myInvalid: Example = {hello: 'world', customYo: 'yo!'} 
// -> ☠️ Invalid! "customYo" must be a function returning a boolean 

既存のキーのインターフェイスにインデックスシグネチャを追加しようとしました。 hello?: string, moo?: boolean)では、すべてのキーがインデックスシグネチャタイプのサブセットである必要があります(この場合、ブール値を返す関数)。明らかに失敗します。

答えて

1

これは、それを回避する唯一の方法は、各インタフェースは2人の別々のインデックス署名、string用とnumber

を持つことができることを利用することである...設計 https://basarat.gitbooks.io/typescript/docs/types/index-signatures.htmlにより、

As soon as you have a string index signature, all explicit members must also conform to that index signature. This is to provide safety so that any string access gives the same result.

ことはできませんあなたの例hellomoo

は、文字列インデックスが使用できなくなるが、あなたは、カスタムメソッドの番号インデックスをハイジャックすることができます

これは動作しますが、直感的な機能につながるし、配列表記法によってそれらを呼び出すしなければならないとして、ほとんど許容インターフェースである
interface IExample { 
    hello?: string 
    moo?: boolean 
    [custom: number]: (v?: any) => boolean 
} 

const myBasic: IExample = {moo: false} 
// -> ✅ Valid! Using known keys 

const myValid: IExample = {hello: 'world', 2:() => true} 
// -> ✅ Valid! "customYo" is a function returning a bool. Good job! 

const myInvalid: IExample = {hello: 'world', 2: 'yo!'} 
// -> ☠️ Invalid! "customYo" must be a function returning a boolean 

myValid.7() // Cannot invoke an expression whose type lacks a call signature. Type 'Number' has no compatible call signatures. 
myValid[2]() // works (but ewwwww what is this!!!) 
// could alias to more readable locals later but still ewwwwww!!! 
const myCustomFunc = myValid[2] 
myCustomFunc() // true 

また、これは型が数値から返されるという警告がありますインデクサーは、文字列インデクサーから返される型のサブタイプでなければなりません。これは、数値を使用してインデックスを作成する場合、javascriptは数字を文字列に変換してからオブジェクトにインデックスを付けるためです

この場合、文字列インデックスタイプはデフォルトのanyです。準拠することができます

重要これは科学のためのものですが、私は実際の生活のアプローチとしてこれをお勧めしません!

+0

素晴らしい返信 - これは私が見つけたものに合致しています。私は '[custom:string]:any 'を強制的に使用して型の安全性を失いました。しかたがない! ⚡️ – papercowboy

関連する問題