コンパイルエラーの原因
[ts]
Property 'username' does not exist on type 'Credentials'.
Property 'username' does not exist on type 'false'.
any
コンパイルエラーの内容を和訳すると
プロパティ 'username' は型 'Credentials' に存在しません。
プロパティ 'username' は型 'false' に存在しません。
となっています。
つまり、Credentials
がboolean型(false)
の可能性があり、boolean型
の場合にはusername
プロパティが存在しないためコンパイルエラーになるということです。
解決方法
username
プロパティを使う段階で、変数credentials
はboolean
型ではないことを示せば良いです。
TypeScript
1interface Credentials {
2 service: string;
3 username: string;
4 password: string;
5}
6
7type CredentialsOrBoolean = Credentials | boolean;
8
9function isBoolean(value: any): value is boolean {
10 return typeof value === "boolean";
11}
12
13namespace Keychain {
14 export interface Options {
15 // 省略
16 }
17 export function getGenericPassword(options?: Keychain.Options): Promise<CredentialsOrBoolean>{
18 // 省略
19 }
20}
21
22(async () => {
23
24 const credentials: CredentialsOrBoolean = await Keychain.getGenericPassword();
25 if (isBoolean(credentials)) {
26 // 何らかの処理
27 return;
28 }
29
30 // isBooleanを通過することで型推論によって
31 // 変数 credentials が CredentialsOrBoolean型 から
32 // boolean型 を含まない Credentials型 に変わる
33 this.setState({
34 username: credentials.username,
35 password: credentials.password,
36 });
37
38})();
コードを分かりやすくするために
boolean型
を含まないインターフェースCredentials型
boolean型
を含む型エイリアスCredentialsOrBoolean型
を分けて定義しています。
また、変数がboolean型
か判定するためのisBoolean
関数を定義しています。
await getGenericPassword
の戻り値の時点では、変数credentials
はCredentialsOrBoolean型
です。
そのため、isBoolean
関数による判定で、boolean型
の場合は処理を先に進ませないようにします。
すると、型推論によって変数credentials
はCredentialsOrBoolean型
からCredentials型
に変わります。
変数credentials
がCredentials型
になったことでcredentials.username
やcredentials.password
でコンパイルエラーが発生しなくなります。
なお、上記はあくまでサンプルなので、変数credentials
がtrue
かfalse
の場合で分岐する必要がある場合には、isBoolean
関数による判定の箇所のコードを置き換えて実装してください。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/09/02 12:36