質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Deno

Denoとは、Node.jsを作ったライアン・ダールが作成したJavaScriptおよびTypeScriptのランタイム。単一の実行ファイルで提供され、外部コードのフェッチに対応しているため、別途パッケージ管理システムを必要としません。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

1回答

447閲覧

TypeScript でプロパティの存在を in で確認してから処理をしているのに型が undefined との合成と推論されてしまう(Deno)。

noc

総合スコア73

Deno

Denoとは、Node.jsを作ったライアン・ダールが作成したJavaScriptおよびTypeScriptのランタイム。単一の実行ファイルで提供され、外部コードのフェッチに対応しているため、別途パッケージ管理システムを必要としません。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

0クリップ

投稿2022/07/08 16:15

編集2022/07/09 05:16

以下のようなコードがあるとして、省略可能なプロパティ kindin で存在することを確認しているから、Set<string> に加えることはできると思うのですが、deno testdeno run では 'string | undefined' と判断されてしまいます。
これは私の書き方がおかしいのでしょうか。それとも Deno がおかしいと思われますか?

typescript

1type Entry = { 2 pattern: string; 3 kind?: string; 4}; 5function foo(entry: Entry){ 6 const set: Set<string> = new Set(); 7 if ("kind" in entry){ 8 set.add(entry.kind); // Argument of type 'string | undefined' is not assignable to parameter of type 'string'. 9 } 10 return set; 11}

また、別の例では関数 bar()isBaz() までで target はプロパティ baz を持ち、その型は Baz と確認しているのですが、
Property 'baz' does not exist on type 'object'. というエラーが出ます。
どう書くのが望ましいでしょうか?

typescript

1type Baz = { [abbr: string]: string }; 2function isBaz(target: any): target is Baz { 3 return typeof target == "object" && 4 Object.values(target).every((value) => typeof value == "string"); 5} 6 7function bar(target: unknown) { 8 if ( !(target != null && typeof target == "object" && "baz" in target && isBaz(target.baz)) ) { 9 throw new Error() 10 } 11 useBaz(target.baz) 12} 13 14function useBaz(baz: Baz) { 15}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のように修正してみると、いかがでしょうか?

前者のコードの修正

diff

1- if ("kind" in entry){ 2+ if (typeof entry.kind === 'string'){

または、entry.kind が空文字列だった場合にはsetに追加しないということでよければ、以下

diff

1- if ("kind" in entry){ 2+ if (entry.kind){

後者のコードの修正

if の条件の中で、isBaz(target.baz)となっているのを、isBaz(target)に修正

diff

1- if ( !(target != null && typeof target == "object" && "baz" in target && isBaz(target.baz)) ) { 2+ if ( !(target != null && typeof target == "object" && "baz" in target && isBaz(target)) ) {

投稿2022/07/08 20:16

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問