自己解決されたようですが、せっかく書いたので貼っておきます。前の質問で
ts
1const a: [string, ...string[]] = ['a', 'b', 'c'];
がエラーにならないのは、['a', 'b', 'c'] というリテラルにはまだ型がついてないので、string[] にも [string, ...string[]] にもなりうるし、なんなら次のような型にも適合する、ということでしょう。
ts
1type A = 'a';
2type B = 'b';
3type C = 'c';
4
5type ABC = [A, B, C];
6let a1: ABC = ['a', 'b', 'c'];
7
8type BorC = B | C;
9let a2: [A, ...BorC[]] = ['a', 'b', 'c'];
10
11let a3: Array<A | B | C> = ['a', 'b', 'c'];
12
13let a4 = ['a', 'b', 'c']; // a4 は string[] に型推論される
14
15a1 = a2; // Error
16a1 = a3; // Error
17a1 = a4; // Error
18a2 = a1; // OK
19a2 = a3; // Error
20a2 = a4; // Error
21a3 = a1; // OK
22a3 = a2; // OK
23a3 = a4; // Error
24a4 = a1; // OK
25a4 = a2; // OK
26a4 = a3; // OK
いったん string[] と型推論されてしまったら、その型は空の配列も含むので、[string, ...string[]] に自動的に変換されることはない (TypeScipr の型は静的なものなので、実行時の実際の値を型に反映させるためには、自分でその型に適合することを確認するコードを書く必要がある) のだと思います。
具体的にはこんな感じでしょうか。
参考: ユーザー定義のType Guard (型ガード - TypeScript Deep Dive 日本語版)
ts
1function notEmpty<T>(arg: T[]): arg is [T, ...T[]] {
2 return arg.length > 0;
3}
4
5const a = foo(); // foo は string[] を返すと仮定
6if (notEmpty(a)) {
7 func(a);
8}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/05/08 08:07
2021/05/08 09:13 編集