質問するログイン新規登録

回答編集履歴

2

追記

2021/05/08 09:11

投稿

hoshi-takanori
hoshi-takanori

スコア7903

answer CHANGED
@@ -1,10 +1,10 @@
1
- 自己解決されたようですが、せっかく書いたので貼っておきます。
1
+ 自己解決されたようですが、せっかく書いたので貼っておきます。[前の質問](https://teratail.com/questions/337107)で
2
2
 
3
3
  ```ts
4
4
  const a: [string, ...string[]] = ['a', 'b', 'c'];
5
5
  ```
6
6
 
7
- がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないために、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう。
7
+ がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないので、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう。
8
8
 
9
9
  ```ts
10
10
  type A = 'a';
@@ -35,4 +35,18 @@
35
35
  a4 = a3; // OK
36
36
  ```
37
37
 
38
- いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値を型に反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。
38
+ いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値を型に反映させるためには、自分でその型に適合することを確認するコードを書く必要がある) のだと思います。
39
+
40
+ 具体的にはこんな感じでしょうか。
41
+ 参考: [ユーザー定義のType Guard (型ガード - TypeScript Deep Dive 日本語版)](https://typescript-jp.gitbook.io/deep-dive/type-system/typeguard#yznotype-guard)
42
+
43
+ ```ts
44
+ function notEmpty<T>(arg: T[]): arg is [T, ...T[]] {
45
+ return arg.length > 0;
46
+ }
47
+
48
+ const a = foo(); // foo は string[] を返すと仮定
49
+ if (notEmpty(a)) {
50
+ func(a);
51
+ }
52
+ ```

1

誤字修正

2021/05/08 09:11

投稿

hoshi-takanori
hoshi-takanori

スコア7903

answer CHANGED
@@ -4,7 +4,7 @@
4
4
  const a: [string, ...string[]] = ['a', 'b', 'c'];
5
5
  ```
6
6
 
7
- がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないために、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということで
7
+ がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないために、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう
8
8
 
9
9
  ```ts
10
10
  type A = 'a';
@@ -35,4 +35,4 @@
35
35
  a4 = a3; // OK
36
36
  ```
37
37
 
38
- いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値をに反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。
38
+ いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値をに反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。