回答編集履歴
2
追記
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'] というリテラルにはまだ型がついてない
|
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
誤字修正
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 の型は静的なものなので、実行時の実際の値を型に反映させるためには、自分でその型に適合することを確認して、明示的に型変換するコードを書く必要がある) のだと思います。
|