「暗黙の任意」がオンになっていると、エラーが表示されます。私はこれがコンパイラの問題かもしれないと思う。
それはあなただけany
にx
をキャストした場合に動作します:
enum Vendor {
A = "a",
B = "b"
}
const isVendor = (x: string | Vendor): x is Vendor => {
return !!Vendor[<any>x];
};
console.info(isVendor("A")); // true
console.info(isVendor("a")); // false
console.info(isVendor("C")); // false
私は、この機能の例では、彼らは同様のキャストを持っているか、他のパラメータはタイプany
であることに気づきます。
この問題の説明については、hereもチェックしてください。
名前や値を探しているかどうかを判断する必要があると私は考えています。あなたの実装に基づいて、私はisVendorName
ではなく、isVendorValue
を実際に探しているかもしれないと思います。 (私はそれも名前がVendor
であれば、それはないですので、依頼する意味があるとは思わない、あなたは値がVendor
であるかどうかを知りたい。):
enum Vendor {
A = "a",
B = "b"
}
// doesn't make sense. the name cannot be a Vendor.
const isVendorName = (name: string | Vendor): name is Vendor => {
return !!Vendor[<any>name];
};
// requires ES7, see below
const isVendorValue = (value: string | Vendor): value is Vendor => {
return Object.values(Vendor).some((x: any) => x === value);
};
console.info(isVendorName("A")); // true
console.info(isVendorName("a")); // false
console.info(isVendorName("C")); // false
console.info(isVendorName(Vendor.A)); // false
console.info(isVendorValue("A")); // false
console.info(isVendorValue("a")); // true
console.info(isVendorValue("C")); // false
console.info(isVendorValue(Vendor.A)); // true
Object.values
が明らかにそうES7ですここに別の実装があります。値は実行時に変更されないため、値をキャッシュすることで恩恵を受ける可能性があります。私は今、私はそれについて考えることを示唆している
const isVendorValue = (value: string | Vendor): value is Vendor => {
return Object
.keys(Vendor)
.map((key: any) => Vendor[key])
.some((x: any) => x === value);
};
もう一つは、あなたの提案に反して、パラメータは、おそらく実際にとにかく種類any
のものでなければならないということです。 「少なくともタイプがstring
であることはわかっていますが、このメソッドの使用をテスト文字列に限定するだけで十分です。
あなたは本当にそれを知っていない、方法を使用する場所に応じて。あなたが知っているのは、それが文字列でなければ、間違いなくVendor
ではないということです。
アイデアは、あるオブジェクトまたは値(string
かどうか)が与えられた場合、それがenum
のメンバであるかどうかを判断し、それがタイプシステムで1として扱われるかどうかを判断します。不必要に狭い方法よりも幅広く適用できる方法が優れています。
const isVendorValue = (value: any): value is Vendor => {
return typeof value === "string" &&
Object
.keys(Vendor)
.map((key: any) => Vendor[key])
.some((x: any) => x === value);
};
私の意図は、ユーザー定義の型ガードであり、 'boolean'を返す関数ではありませんでした。あなたの例はコンパイラに型情報を伝えるのではなく、単に真または偽を返します。これは、ユーザー定義型ガードだけが達成できるものです。 – Rick
@Rickあなたは 'return !!ベンダー[x]'が 'boolean'以外にもどると期待していますか? K申し訳ありませんが、このコンセプトを読んでいます... –
ユーザー定義の型ガードはブール値を返しますが、単純にboolを返す以外のことはしません。参照:https://basarat.gitbooks.io/typescript/docs/types/typeGuard.html – Rick