前提・実現したいこと
Visual Studio Code で, 以下の制約を満たす color.ts
を作成したい。
質問
colorオブジェクトに型の補完を実現しながら、別ファイルからは、オブジェクトリテラル型に見える方法はありますか? または、JSDocとかでcolorの型補完を実現する方法はありますか?
ある場合、TypeSript Playgroundにサンプル例をお願いします。 m(_ _)m
または、代替案や改善案などがあれば助かります。
制約
- colorオブジェクトにColorの型補完(300, 'default', ...)
- 可能な限り、Color型を変更不可
config.ts
を変更不可
発生している問題・エラーメッセージ
Visual Studio Code で、color.ts の colorオブジェクトに型の補完がない。(colorオブジェクトの中身を間違えたときにコンパイルエラーが発生しない)
該当のソースコード
color.ts他 | TypeSctipt Playground
typescript
1// test.ts (for assert type) 2// FYI: https://qiita.com/kgtkr/items/2a8290d1b1314063a524 3export type TypeEq<A, B> = (<T>() => T extends A ? 1 : 2) extends (< 4 T 5>() => T extends B ? 1 : 2) 6 ? true 7 : false 8 9export function assertType<_T extends true>() {} 10export function assertNotType<_T extends false>() {} 11 12// color.ts 13// export const color: Color = { 14export const color = { 15 black: { 16 // TODO: config.tsの中身を変更せずに、Color('300', ...)型の補完が欲しい!! 17 '100': '#595959', 18 '200': '#404040', 19 '400': '#383838', 20 '600': '#2e2e2e', 21 '800': '#262626', 22 '900': '#0d0d0d', 23 default: '#333333', 24 }, 25 white: { 26 '100': '#fff', 27 '400': '#f9fafb', 28 '600': '#edeff2', 29 '800': '#e4e7ec', 30 '900': '#c7ccd6', 31 default: '#f4f5f7', 32 }, 33} 34 35export type Color = { 36 [color in string]: Partial<{ 37 [num in Numbers]: string; 38 }> 39} 40 41type Numbers = 42 | '100' 43 | '200' 44 | '300' 45 | '400' 46 | '500' 47 | '600' 48 | '700' 49 | '800' 50 | '900' 51 | 'default'; 52 53// config.ts 54// import { colors } from './color.ts'; 55// import { assertType } from './test.ts'; 56 57type ExpectedColor = { 58 black: { 59 '100': string; 60 '200': string; 61 '400': string; 62 '600': string; 63 '800': string; 64 '900': string; 65 default: string; 66 }; 67 white: { 68 '100': string; 69 '400': string; 70 '600': string; 71 '800': string; 72 '900': string; 73 default: string; 74 }; 75} 76 77// TODO: color type should be ExpectedColor 78assertType<TypeEq<typeof color, ExpectedColor>>() 79 80export const config: Config = { 81 dark: { 82 background: color.black.default, 83 foreground: color.white.default, 84 }, 85 light: { 86 background: color.white[800], 87 foreground: color.black[600], 88 } 89} 90 91type Config = { 92 [theme in 'dark' | 'light']: { 93 background: string; 94 foreground: string; 95 } 96}
試したこと
- color.tsの
const color = {
とした。制約1を満たさない。 - Colorの
Partial
を外した。assertType<TypeEq<typeof color, ExpectedColor>>()
を満たさない。 - color.tsの
// export const color: Color = {
のコメントを外した。制約3を満たさない。
質問(再掲)
colorオブジェクトに型の補完を実現しながら、別ファイルからは、オブジェクトリテラル型に見える方法はありますか?
または、JSDocとかでcolorの型補完を実現する方法はありますか?
ある場合、TypeSript Playgroundにサンプル例をお願いします。 m(_ _)m
補足情報(FW/ツールのバージョンなど)
あなたの回答
tips
プレビュー