TypeScript で、以下のように、「最低一個、いくつかの string
の末尾一つだけが number
」という形の配列に対するTypeがうまく書けず困っております。
Typescript
1 2// 最低 1つ以上の文字列が連続し、末尾は必ず number という例 3 4const a = ['hoge', 10] 5const b = ['hoge', 'fuga', 22] 6const c = ['hoge', 'fuga', 'piyo', 35] 7
この逆で、先頭だけ number
で、後方が可変長な string
の場合は、 以下のようなタプル型でマッチさせることができました。
Typescript
1 2 3type T1 = [number, ...string[]] 4 5const x: T1 = [10, 'hoge',] // OK 6const y: T1 = [22, 'hoge', 'fuga' ] // OK 7const z: T1 = [35, 'hoge', 'fuga', 'piyo' ] // OK 8
試しに 以下のようにT2
を [...string[], number]
と書くと、解釈が (string | number)[]
に変化してしまい、予想外の型である、以下の d
や e
も受け入れてしまいます。
Typescript
1 2type T2 = [...string[], number] // (string | number)[] に変化してしまう。 3 4const a: T2 = ['hoge', 10] // OK 5const b: T2 = ['hoge', 'fuga', 22] // OK 6const c: T2 = ['hoge', 'fuga', 'piyo', 35] // OK 7const d: T2 = [12, 'fuga', 'piyo', 35] // OK : エラーにしたいが、受け入れてしまう 8const e: T2 = ['hoge', 12, 22, 35] // OK : エラーにしたいが、受け入れてしまう 9
また同時に以下の警告が出ます。
A rest element must be last in a tuple type.ts(1256)
この T2 をどのように書けばうまくいくでしょうか。
回答3件
あなたの回答
tips
プレビュー