回答編集履歴

2

追記

2021/05/08 09:11

投稿

hoshi-takanori
hoshi-takanori

スコア7901

test CHANGED
@@ -1,4 +1,4 @@
1
- 自己解決されたようですが、せっかく書いたので貼っておきます。
1
+ 自己解決されたようですが、せっかく書いたので貼っておきます。[前の質問](https://teratail.com/questions/337107)で
2
2
 
3
3
 
4
4
 
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないために、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう。
13
+ がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないので、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう。
14
14
 
15
15
 
16
16
 
@@ -72,4 +72,32 @@
72
72
 
73
73
 
74
74
 
75
- いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値を型に反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。
75
+ いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値を型に反映させるためには、自分でその型に適合することを確認するコードを書く必要がある) のだと思います。
76
+
77
+
78
+
79
+ 具体的にはこんな感じでしょうか。
80
+
81
+ 参考: [ユーザー定義のType Guard (型ガード - TypeScript Deep Dive 日本語版)](https://typescript-jp.gitbook.io/deep-dive/type-system/typeguard#yznotype-guard)
82
+
83
+
84
+
85
+ ```ts
86
+
87
+ function notEmpty<T>(arg: T[]): arg is [T, ...T[]] {
88
+
89
+ return arg.length > 0;
90
+
91
+ }
92
+
93
+
94
+
95
+ const a = foo(); // foo は string[] を返すと仮定
96
+
97
+ if (notEmpty(a)) {
98
+
99
+ func(a);
100
+
101
+ }
102
+
103
+ ```

1

誤字修正

2021/05/08 09:11

投稿

hoshi-takanori
hoshi-takanori

スコア7901

test CHANGED
@@ -10,7 +10,7 @@
10
10
 
11
11
 
12
12
 
13
- がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないために、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということで
13
+ がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないために、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう
14
14
 
15
15
 
16
16
 
@@ -72,4 +72,4 @@
72
72
 
73
73
 
74
74
 
75
- いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値をに反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。
75
+ いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値をに反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。