TS2322 とは、「代入しようとした値の型(左の Type 'A')が、受け取る側の型(右の type 'B')に合わない」ときに tsc が出すエラーです。 英語では Type 'A' is not assignable to type 'B'.、日本語表示では「型 'A' を型 'B' に割り当てることはできません。」と出ます。変数への代入だけでなく、return の値、オブジェクトのプロパティ、コールバック関数など、値を「どこかに入れる」場面すべてで出るため、原因は1つではありません。

この記事では、TS2322 だけに絞って17の原因を最小コードで再現し、tsc の出力全文(入れ子の補足行つき)と修正後のコードを並べます。原因を見分ける手がかりは、エラー文の2行目以降に出る語句です。

確認環境:Ubuntu 24.04 / TypeScript 7.0.2(比較用に 6.0.3 と 5.9.3)/ Node.js 22.22.2。オプションは strict: true、target: es2022 です。掲載した出力はすべてこの環境の tsc のものです。

TS2322 の早見表(エラー文に出る語句から原因を引く)

エラー文に出る語句 原因 直し方 本文
Type 'undefined' is not assignable find の戻り値などに undefined が混ざる ?? で既定値、または受け取る側に undefined を含める 2・11
Type 'null' is not assignable null が入りうる値を渡した null のときの値を決める 3
Type 'string' is not assignable to type 'Size' など(右が型の別名やリテラルのユニオン) let やオブジェクトでリテラル型が string に広がった const、as const、型注釈 4・5
Type 'string | number' … の次に Type 'number' … ユニオンを絞り込んでいない typeof で分岐、変換 6
Target requires 2 element(s) but source may have fewer. 配列をタプルへ代入 作る時点でタプルの型注釈 7
is 'readonly' and cannot be assigned to the mutable type readonly 配列を通常の配列へ スプレッドでコピー、受け取る側を readonly に 8
(位置が return 文) 戻り値の型注釈と return の値が違う return の値か戻り値の型を直す 9
左側の型が Promise<number> など Promise で包まれている await の付け忘れ await を付ける 10
Types of parameters 'x' and 'y' are incompatible. コールバックの引数の型が狭い 引数の型注釈を外して中で絞り込む 12
could be instantiated with a different subtype of constraint 型引数 T に具体的な値を返した 戻り値の型を広げる 13
Type 'unknown' is not assignable unknown を確かめずに使った typeof・in で確かめる 14
… is not assignable to type 'never' ユニオンのキーで書き込んだ キーを型引数にする 15
Types of property 'x' are incompatible. プロパティ x の型が違う(次の行が原因) 次の行を読んで x を直す 3・5・8・17
The types of 'a.b.c' are incompatible between these types. 深い階層のプロパティの型が違う 道順の先の値を直す 16
Property 'x' is missing in type 入れ子のオブジェクトでプロパティが足りない プロパティを加える 17

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「TS2322「型を型に割り当てられません」原因別の直し方一覧」

入れ子メッセージの読み方

TS2322 は、型が複雑になると字下げされた補足行が続きます。読み方の決まりは3つです。

行 役割 読み方
1行目 結論 「Type 'A'」が渡した値の型、「type 'B'」が受け取る側の型。ファイル名の後ろの(行,桁)が場所
中間の行 道順 どのプロパティ・どの引数を比べたか
最後の行 原因 実際に食い違っている最小の型の組み合わせ。まずここを読む

実例で確かめます。

interface Member {
  name: string;
  nickname: string;
}
const input: { name: string; nickname: string | null } = { name: "田中", nickname: null };
const member: Member = input;
p03.ts(6,7): error TS2322: Type '{ name: string; nickname: string | null; }' is not assignable to type 'Member'.
  Types of property 'nickname' are incompatible.
    Type 'string | null' is not assignable to type 'string'.
      Type 'null' is not assignable to type 'string'.
  • 1行目:6行目7桁目(member)で、オブジェクト全体が Member に合わない
  • 2行目:食い違っているのは nickname プロパティ
  • 3行目:nickname は string | null を string に入れようとしている
  • 4行目:そのうち null が合わない

1行目だけを見ると「オブジェクト全体が合わない」としか分かりませんが、最後の行まで読むと「nickname に null が入りうる」ことが原因だと分かります。 直す場所は2行目、直す内容は最後の行、と覚えると速く読めます。

中間の行に出る「道順」の語句は、次の4種類を押さえれば十分です。

道順の語句 意味
Types of property 'x' are incompatible. プロパティ x を比べた
The types of 'a.b.c' are incompatible between these types. 深い階層 a.b.c を比べた(途中をまとめて表示)
Types of parameters 'x' and 'y' are incompatible. 関数の引数どうしを比べた(ここから左右の向きが逆になる)
Type 'X | Y' … の次の行に Type 'Y' … ユニオンのうち Y のほうが合わない

原因別の再現コードと tsc 7.0.2 の出力

各パターンは、直す前のコード、tsc の出力全文、直したコードの順に並べています。直したコードは、まとめてコンパイルしてエラー0件になることを確かめています。

1. 基本の型が違う(string を number へ)

const count: number = "3";
p01.ts(1,7): error TS2322: Type 'string' is not assignable to type 'number'.

入れ子の行はなく、1行だけです。1行目の「Type 'A'」が渡した値、「type 'B'」が受け取る側です。

直し方:値を変換するか、受け取る側の型注釈を見直します。

const count: number = Number("3");

2. undefined が混ざっている(find の戻り値)

const names = ["田中", "佐藤"];
const found: string = names.find((n) => n.startsWith("田"));
p02.ts(2,7): error TS2322: Type 'string | undefined' is not assignable to type 'string'.
  Type 'undefined' is not assignable to type 'string'.

find は見つからないとき undefined を返すので、型は string | undefined です。2行目の「Type 'undefined' is not assignable」が本当の原因です。

直し方:?? で既定値を決めるか、受け取る側の型に undefined を含めます。

const names = ["田中", "佐藤"];
// 既定値を決める
const found: string = names.find((n) => n.startsWith("田")) ?? "";
// または、受け取る側を undefined 込みにする
const found2: string | undefined = names.find((n) => n.startsWith("田"));

3. null が混ざっている(オブジェクトのプロパティ)

interface Member {
  name: string;
  nickname: string;
}
const input: { name: string; nickname: string | null } = { name: "田中", nickname: null };
const member: Member = input;
p03.ts(6,7): error TS2322: Type '{ name: string; nickname: string | null; }' is not assignable to type 'Member'.
  Types of property 'nickname' are incompatible.
    Type 'string | null' is not assignable to type 'string'.
      Type 'null' is not assignable to type 'string'.

4行の入れ子です。2行目の「Types of property 'nickname' are incompatible.」が場所、最後の行が原因(null)を示します。

直し方:null の入るプロパティだけ、値を決めて上書きします。

interface Member {
  name: string;
  nickname: string;
}
const input: { name: string; nickname: string | null } = { name: "田中", nickname: null };
const member: Member = { ...input, nickname: input.nickname ?? "" };

4. リテラル型が string に広がった(let で宣言)

type Size = "s" | "m" | "l";
let picked = "m";
const size: Size = picked;
p04.ts(3,7): error TS2322: Type 'string' is not assignable to type 'Size'.

let で宣言した変数は、あとで別の文字列を入れられるように string 型になります。受け取る側が型エイリアスのときは、エラー文にはユニオンの中身ではなく別名(Size)が出ます。

直し方:const にするか、変数に型注釈を付けます。

type Size = "s" | "m" | "l";
// const にすると "m" というリテラル型のまま
const picked = "m";
const size: Size = picked;
// let のままなら型注釈を付ける
let picked2: Size = "m";
const size2: Size = picked2;

5. オブジェクトのプロパティが string に広がった

interface Row {
  status: "open" | "done";
}
const row = { status: "open" };
const r: Row = row;
p19.ts(5,7): error TS2322: Type '{ status: string; }' is not assignable to type 'Row'.
  Types of property 'status' are incompatible.
    Type 'string' is not assignable to type '"done" | "open"'.

オブジェクトリテラルを変数に入れると、プロパティ status は string に広がります。3行目に、受け取る側のユニオンの中身が表示されます。

直し方:as const を付けるか、変数に型注釈を付けます。

interface Row {
  status: "open" | "done";
}
// as const でリテラル型のままにする
const row = { status: "open" } as const;
const r: Row = row;
// または、最初から型注釈を付ける
const row2: Row = { status: "open" };

6. ユニオン型を絞り込まずに代入した

function show(id: string | number) {
  const text: string = id;
}
p13.ts(2,9): error TS2322: Type 'string | number' is not assignable to type 'string'.
  Type 'number' is not assignable to type 'string'.

string | number のうち、number のほうが合わないと2行目が教えてくれます。

直し方:typeof で分岐するか、String() などで変換します。

function show(id: string | number) {
  const text: string = String(id);
}

7. 配列をタプルへ代入した

const xs = [10, 20];
const pair: [number, number] = xs;
p07.ts(2,7): error TS2322: Type 'number[]' is not assignable to type '[number, number]'.
  Target requires 2 element(s) but source may have fewer.

xs は number[](長さが決まっていない配列)と推論されます。「Target requires 2 element(s) but source may have fewer.」は、タプルが要求する要素数を配列が保証できないという意味です。

直し方:配列を作る時点でタプルの型注釈を付けます。

const xs: [number, number] = [10, 20];
const pair: [number, number] = xs;

8. readonly な配列を、書き換えできる配列へ代入した

interface Config {
  tags: string[];
}
const fixed: { tags: readonly string[] } = { tags: ["a", "b"] };
const config: Config = fixed;
p08.ts(5,7): error TS2322: Type '{ tags: readonly string[]; }' is not assignable to type 'Config'.
  Types of property 'tags' are incompatible.
    The type 'readonly string[]' is 'readonly' and cannot be assigned to the mutable type 'string[]'.

最後の行の「is 'readonly' and cannot be assigned to the mutable type」が原因です。

直し方:スプレッドでコピーを作るか、受け取る側を readonly string[] にします。

interface Config {
  tags: string[];
}
const fixed: { tags: readonly string[] } = { tags: ["a", "b"] };
const config: Config = { tags: [...fixed.tags] };

9. 戻り値の型と return の値が違う

function total(prices: number[]): number {
  if (prices.length === 0) {
    return "0";
  }
  return prices.reduce((a, b) => a + b, 0);
}
p09.ts(3,5): error TS2322: Type 'string' is not assignable to type 'number'.

エラーの位置(3行目5桁目)は return 文です。関数の戻り値の型注釈が「受け取る側」になります。

直し方:return の値を戻り値の型に合わせます。

function total(prices: number[]): number {
  if (prices.length === 0) {
    return 0;
  }
  return prices.reduce((a, b) => a + b, 0);
}

10. Promise をそのまま代入した(await 忘れ)

async function loadCount(): Promise<number> {
  return 3;
}
async function main() {
  const count: number = loadCount();
}
p10.ts(5,9): error TS2322: Type 'Promise<number>' is not assignable to type 'number'.

1行目の左側に Promise<number> のような Promise で包まれた型が出たら、await の付け忘れです。

直し方:await を付けます。

async function loadCount(): Promise<number> {
  return 3;
}
async function main() {
  const count: number = await loadCount();
}

11. 配列の要素に undefined が残っている(map のあと)

function parse(text: string): number | undefined {
  const n = Number(text);
  return Number.isNaN(n) ? undefined : n;
}
const values: number[] = ["1", "x"].map(parse);
p20.ts(5,7): error TS2322: Type '(number | undefined)[]' is not assignable to type 'number[]'.
  Type 'number | undefined' is not assignable to type 'number'.
    Type 'undefined' is not assignable to type 'number'.

配列どうしの代入では、2行目に要素の型の比較、3行目に原因が出ます。

直し方:filter で undefined を取り除きます。

function parse(text: string): number | undefined {
  const n = Number(text);
  return Number.isNaN(n) ? undefined : n;
}
const values: number[] = ["1", "x"].map(parse).filter((v) => v !== undefined);

12. 関数の引数の型が狭い(コールバック)

type Handler = (value: string | number) => void;
const onChange: Handler = (value: string) => {
  console.log(value.toUpperCase());
};
p12.ts(2,7): error TS2322: Type '(value: string) => void' is not assignable to type 'Handler'.
  Types of parameters 'value' and 'value' are incompatible.
    Type 'string | number' is not assignable to type 'string'.
      Type 'number' is not assignable to type 'string'.

2行目の「Types of parameters 'value' and 'value' are incompatible.」は、引数どうしを比べたという意味です。Handler は number も渡してくるのに、代入した関数は string しか受け取れないので合いません。3行目からは向きが逆になり、「受け取る側が渡してくる型」が左に出ます。

直し方:引数の型注釈を外して Handler から推論させ、関数の中で絞り込みます。

type Handler = (value: string | number) => void;
const onChange: Handler = (value) => {
  console.log(typeof value === "string" ? value.toUpperCase() : value);
};

13. ジェネリクスの制約(could be instantiated with a different subtype)

function fallback<T extends string>(value: T | undefined): T {
  return value ?? "none";
}
p11.ts(2,3): error TS2322: Type '"none" | T' is not assignable to type 'T'.
  '"none" | T' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string'.
    Type 'string' is not assignable to type 'T'.
      'string' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string'.

T は string そのものではなく、呼び出し側が決める「string の一部」(たとえば "a" | "b")です。"none" が T に含まれるとは限らないので、T として返せません。

直し方:戻り値の型を、実際に返す値に合わせて広げます。

function fallback<T extends string>(value: T | undefined): T | "none" {
  return value ?? "none";
}

14. unknown をそのまま代入した

const data: unknown = JSON.parse('{"name":"田中"}');
const name2: string = data;
p14.ts(2,7): error TS2322: Type 'unknown' is not assignable to type 'string'.

JSON.parse の結果を unknown で受けたときなどに出ます。

直し方:typeof や in で確かめてから使います。

const data: unknown = JSON.parse('{"name":"田中"}');
const name2: string =
  typeof data === "object" && data !== null && "name" in data && typeof data.name === "string"
    ? data.name
    : "";

15. 受け取る側が never になっている(キーがユニオン)

const stock = { title: "ノート", count: 3 };
function update(key: keyof typeof stock, value: string | number) {
  stock[key] = value;
}
p15.ts(3,3): error TS2322: Type 'string | number' is not assignable to type 'never'.
  Type 'string' is not assignable to type 'never'.

key が "title" | "count" のどちらか分からないので、stock[key] に書ける値は「string かつ number」、つまり never になります。「type 'never'」が右側に出たら、キーと値の対応を tsc が追えていないと読みます。

直し方:キーを型引数 K にして、値の型を K から引きます。

const stock = { title: "ノート", count: 3 };
function update<K extends keyof typeof stock>(key: K, value: (typeof stock)[K]) {
  stock[key] = value;
}
update("count", 5);

16. 深い階層のプロパティの型が違う

interface Page {
  meta: { author: { name: string; age: number } };
}
const raw = { meta: { author: { name: "田中", age: "30" } } };
const page: Page = raw;
p16.ts(5,7): error TS2322: Type '{ meta: { author: { name: string; age: string; }; }; }' is not assignable to type 'Page'.
  The types of 'meta.author.age' are incompatible between these types.
    Type 'string' is not assignable to type 'number'.

階層が深いと、2行目が「The types of 'meta.author.age' are incompatible between these types.」とドットでつないだ道順になります。

直し方:道順の先にあるプロパティの値を直します。

interface Page {
  meta: { author: { name: string; age: number } };
}
const raw = { meta: { author: { name: "田中", age: 30 } } };
const page: Page = raw;

17. 入れ子のオブジェクトでプロパティが足りない

interface Order {
  id: number;
  customer: { name: string; email: string };
}
const draft = { id: 1, customer: { name: "田中" } };
const order: Order = draft;
p18.ts(6,7): error TS2322: Type '{ id: number; customer: { name: string; }; }' is not assignable to type 'Order'.
  Types of property 'customer' are incompatible.
    Property 'email' is missing in type '{ name: string; }' but required in type '{ name: string; email: string; }'.

変数を経由して代入すると、足りないプロパティは TS2322 の入れ子(3行目)として出ます。

直し方:足りないプロパティを加えます。

interface Order {
  id: number;
  customer: { name: string; email: string };
}
const draft = { id: 1, customer: { name: "田中", email: "tanaka@example.com" } };
const order: Order = draft;

TS2322 ではなく隣の番号になるケース

「型が合わない」内容でも、書き方によっては TS2322 以外の番号になります。TS2322 を探して見つからないときは、次の番号を確かめます。

余剰プロパティ(オブジェクトリテラルに余分なキー)は TS2353・TS2561

interface Item {
  title: string;
  options: { color: string };
}
const item: Item = {
  title: "ノート",
  options: { color: "red", colour: "red" },
};
p05.ts(7,28): error TS2561: Object literal may only specify known properties, but 'colour' does not exist in type '{ color: string; }'. Did you mean to write 'color'?

似た名前のプロパティがあると、候補つきの TS2561 になります。候補がないときは TS2353 です。

type Shape =
  | { kind: "circle"; radius: number }
  | { kind: "square"; size: number };
const shape: Shape = { kind: "circle", radius: 5, size: 3 };
p17.ts(4,51): error TS2353: Object literal may only specify known properties, and 'size' does not exist in type '{ kind: "circle"; radius: number; }'.

直し方は、余分なキーを消すか、型の側にそのプロパティを加えることです。

オブジェクトリテラルでプロパティが足りないときは TS2741

interface Order {
  id: number;
  customer: { name: string; email: string };
}
const order: Order = {
  id: 1,
  customer: { name: "田中" },
};
p06.ts(7,3): error TS2741: Property 'email' is missing in type '{ name: string; }' but required in type '{ name: string; email: string; }'.

パターン17と同じ内容ですが、オブジェクトリテラルを直接書いたときは、足りない場所(7行目の customer)を指す TS2741 が単独で出ます。 変数を経由すると TS2322 の入れ子になります。

書き方 番号 位置
オブジェクトリテラルを直接代入し、余分なキーがある TS2353(候補があれば TS2561) 余分なキーの位置
オブジェクトリテラルを直接代入し、キーが足りない TS2741 足りないオブジェクトの位置
変数を経由して代入し、キーが足りない TS2322(入れ子に Property … is missing) 代入先の変数
関数の引数に渡した値の型が合わない TS2345 引数の位置

5.9・6.0・7.0 で文言は変わるか

この記事の20ファイル(TS2322 の17パターンと、隣の番号の3つ)を、TypeScript 5.9.3・6.0.3・7.0.2 の tsc にそれぞれかけて、出力を diff で比べました。

比べた組み合わせ 違いのあった行
5.9.3 と 7.0.2 1行(パターン5)
6.0.3 と 7.0.2 1行(パターン5、5.9.3 と同じ内容)

違いは、ユニオン型のメンバーの並び順だけでした。

5.9.3 / 6.0.3:  Type 'string' is not assignable to type '"open" | "done"'.
7.0.2:          Type 'string' is not assignable to type '"done" | "open"'.

エラー番号、位置、入れ子の行数、文言は3つの版で同じです。5.x 向けに書かれた解説のエラー文は、7.0 でもそのまま検索の手がかりにできます。ユニオンの並び順は書いた順と違う場合があるので、エラー文を検索するときは並び順を含めない語句(Types of property など)を使うと見つけやすくなります。

日本語表示(--locale ja)との対応

tsc に --locale ja を付けると、同じエラーが日本語で表示されます。7.0.2 で実際に出た文言の対応です。

英語 日本語(--locale ja)
Type 'A' is not assignable to type 'B'. 型 'A' を型 'B' に割り当てることはできません。
Types of property 'x' are incompatible. プロパティ 'x' の型に互換性がありません。
The types of 'a.b.c' are incompatible between these types. 'a.b.c' の型は、これらの型同士で互換性がありません。
Types of parameters 'x' and 'y' are incompatible. パラメーター 'x' および 'y' は型に互換性がありません。
Target requires 2 element(s) but source may have fewer. ターゲットには 2 個の要素が必要ですが、ソースに指定する数はそれより少なくても構いません。
The type 'X' is 'readonly' and cannot be assigned to the mutable type 'Y'. 型 'X' は 'readonly' であるため、変更可能な型 'Y' に代入することはできません。
Property 'x' is missing in type 'A' but required in type 'B'. プロパティ 'x' は型 'A' にありませんが、型 'B' では必須です。
'X' is assignable to the constraint of type 'T', but 'T' could be instantiated with a different subtype of constraint 'string'. 'X' は型 'T' の制約に代入できますが、'T' は制約 'string' の別のサブタイプでインスタンス化できることがあります。

パターン3を日本語で表示した全文です。

p03.ts(6,7): error TS2322: 型 '{ name: string; nickname: string | null; }' を型 'Member' に割り当てることはできません。
  プロパティ 'nickname' の型に互換性がありません。
    型 'string | null' を型 'string' に割り当てることはできません。
      型 'null' を型 'string' に割り当てることはできません。

日本語表示の文言も、5.9.3・6.0.3・7.0.2 で違ったのはユニオンの並び順の1行だけでした。

直し方を選ぶ判断表

TS2322 は as(型アサーション)を書けば消えますが、原因が残ったままになります。次の順で考えると、型の安全さを保ったまま直せます。

順番 考えること 選ぶ直し方
1 値のほうが本当に違っているか 値を直す、変換する(Number()・String()・await)
2 undefined・null の場合を決めていないだけか ?? で既定値、if で分岐
3 推論で型が広がっただけか const、as const、変数の型注釈
4 受け取る側の型が狭すぎるか 受け取る側の型を広げる(ユニオン、readonly、戻り値の型)
5 外から来た値で、型が分からないか typeof・in・型ガードで確かめる

よくある質問

Q. TS2322 と TS2345 は何が違いますか? A. TS2322 は変数・プロパティ・戻り値への代入、TS2345 は関数の引数に渡したときに出ます。入れ子の補足行の読み方は同じです。

Q. エラー文が長くて読めないときは、どこから読めばよいですか? A. いちばん下の行から読みます。そこに食い違っている最小の型の組み合わせが出ています。次に2行目以降の「Types of property」などで場所を特定します。

Q. 「Type 'string' is not assignable to type 'never'」は何が起きていますか? A. 受け取る側が「どの型も入れられない」状態です。ユニオン型のキーでオブジェクトに書き込んだときによく出ます。パターン15のように、キーを型引数にして値の型をキーから引くと直せます。

Q. 日本語と英語のどちらで表示するのがよいですか? A. 検索で情報を探すなら英語の文言のほうが見つかりやすく、意味をつかむには日本語が読みやすいです。エラー番号(TS2322)は共通なので、番号と上の対応表を合わせて使うと両方の利点を得られます。

まとめ

  • TS2322 は「左の Type 'A' を、右の type 'B' に入れられない」という意味。代入・return・プロパティ・コールバックのどこでも出る
  • 入れ子のメッセージは、最後の行が原因、中間の行が場所。下から読むと速い
  • undefined・null・never・Promise・readonly・Target requires など、後半に出る語句で原因を見分けられる
  • リテラル型が string に広がったときは const・as const・型注釈で直す
  • オブジェクトリテラルを直接書いたときの余分なキーは TS2353・TS2561、足りないキーは TS2741 と、隣の番号になる
  • 5.9.3・6.0.3・7.0.2 で、番号と文言は同じ。違いはユニオンの並び順の1行だけだった
  • as で消す前に、値・既定値・推論・受け取る側の型の順に見直す

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「TS2322「型を型に割り当てられません」原因別の直し方一覧」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?