質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

Q&A

解決済

2回答

3171閲覧

typescriptのtypeの値制限方法について

ayu

総合スコア212

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

TypeScript

TypeScriptは、マイクロソフトによって開発された フリーでオープンソースのプログラミング言語です。 TypeScriptは、JavaScriptの構文の拡張であるので、既存の JavaScriptのコードにわずかな修正を加えれば動作します。

0グッド

3クリップ

投稿2020/03/29 14:28

こんばんは。

typescriptのコードを書いていて、書き方がわからなかったので、教えていただきたいです。

javascript

1export const FONT_SIZE = { 2 s: 12, 3 b: 14, 4 m: 16, 5 l: 20, 6 xl: 24 7}

javascript

1import {FONT_SIZE} from '../../' 2 3type Props = { 4 size?: 's' | 'b' | 'm' | 'l' | 'xl', 5}

ここでFONT_SIZEからtype Propsのsizeのプロパティを制限したいです。
今は直打ちを書いているのですが、これをimportしたFONT_SIZEkeyで制限したいです。

うまくできなかったのですが、書き方で解決策はありますでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは
以下のようにしてみると、いかがでしょうか?

フォントのサイズに関する型や、具体的なサイズの情報を集めたファイル名を仮に fontSize.ts とします。これに以下のように、TFontSize 型を定義します。(※先頭のTは私が個人的な慣習として型名につける接頭辞ですので、型名は適宜変えて下さい)

typescript

1export const FONT_SIZE = { 2 s: 12, 3 b: 14, 4 m: 16, 5 l: 20, 6 xl: 24 7} as const; 8 9export type TFontSize = keyof typeof FONT_SIZE; 10 11export const DEFAULT_SIZE = FONT_SIZE.m; 12

上記のようにすると、 TFontSize は、実質的に "s" | "b" | "m" | "l" | "xl" として機能するので、たとえば、以下のようなコンポーネントText

tsx

1import React from 'react'; 2import styled from 'styled-components'; 3import { TFontSize, FONT_SIZE, DEFAULT_SIZE } from "./fontSize"; 4 5type TProps = { 6 size?: TFontSize; 7} 8 9const Text = styled.span` 10 font-size: ${(props: TProps) => props.size ? FONT_SIZE[props.size] : DEFAULT_SIZE}px; 11`; 12 13export default Text; 14 15 16

を作ったとして、これを利用するときに

tsx

1<Text size="m">Hello World</Text>

とは書けますが、

tsx

1<Text size="medium">Hello World</Text>

は、FONT_SIZE のキーに "medium"が無いのでエラーになります。

以上、参考になれば幸いです。

投稿2020/03/29 22:12

編集2020/03/29 22:59
jun68ykt

総合スコア9058

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2020/03/29 23:17

回答ありがとうございます! 自分がやりたかったことは、まさしくこれです! `as const`で値を固定化できたんですね:memo: `keyof typefof`も初めて知りました。 typescriptまだまだいろんな技があると思うのですが、学習していきたいと思います。 ありがとうございました!
jun68ykt

2020/03/29 23:31

どういたしまして。 > 自分がやりたかったことは、まさしくこれです! とのことで、よかったです????
guest

0

FONT_SIZEのkeyで制限したいです。

keyで値を取得というのであれば、こんな感じです。

javascript

1const FONT_SIZE = { 2 s: 12, 3 b: 14, 4 m: 16, 5 l: 20, 6 xl: 24 7} 8 9let size = "m"; // 変更するキー 10let fontsize = FONT_SIZE[size.toLowerCase()]; 11 12console.log( fontsize );

投稿2020/03/29 16:44

AkitoshiManabe

総合スコア5434

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ayu

2020/03/29 23:11

ありがとうございます! 自分の質問の書き方が悪かったのですが、試したかったのは、型で判定したいということでした:bow:
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問