以下のようなディレクトリ構成で、
└📁backend └📝tsconfig.json └📝teamA.ts └📁frontend └📝tsconfig.json └📝team.type.ts └📝member.type.ts
ファイルの中身が以下だとします。
backend/tsconfig.json
{
  ...略
    "baseUrl": "./",
  ...略
  },
  "include": ["**/*.ts"]
}
backend/team.type.ts
import { Member } from "src/member.type";
export type Team = {
  id: string;
  member: Member[];
};
backend/member.type.ts
export type Member = {
  id: string;
  name: string;
};
frontend/teamA.ts
import { Team } from "backend/src/team.type";
const teamA: Team = {
  id: "1",
  member: [
    {
      id: "a",
      name: "yamada",
    },
  ],
};
frontend/tsconfig.json
{
  "compilerOptions": {
    ...略
    "baseUrl": "./../"
  ...略
  },
  "include": [
  ...略
    "./../backend/**/*.ts"
  ],
  ...略
}
このとき、frontend/teamA.tsで、teamA.member[0].nameみたいにしてアクセスすると、なぜかanyになりました。

これの原因は以下の2つのプロパティが指し示すパスが異なっているのが原因でした。
- backend/tsconfig.jsonの- baseurl
- frontend/tsconfig.jsonの- baseurl
frontend/teamA.tsから見ると、backend/team.type.tsのimport文の
import { Member } from "src/member.type";
のパスが解決できないっぽいです。
というのもfrontend側のbaseurlは"./../"になってるので、これはプロジェクトルートを指していることになります。なのでfrontend側かrするとトップディレクトリにはbackendとfrontendディレクトリしかないのに「src/member.type?そんなの無いぞ」みたいになってしまう。
なので、backend/tsconfig.jsonを以下のように修正して、
{
  ...略
    "baseUrl": "./../",
  ...略
  },
  "include": ["**/*.ts"]
}
backend/team.type.tsのimport文を、以下のように修正してやると無事になおりました。(こうするとfrontendと同じパスを指定するようになるので)
import { Member } from "backend/src/member.type";

▲無事補完されるようになった
モノレポで開発すると、tsconfig.json 周りでいろいろハマりポイントがあるので難しいですね。。
今回みたいにシンプルな例だとわかりやすいですが、複雑なコードだと何が原因でanyになってるのか分からないし、明確にエラー表示も出てくれないので、どこが悪いのか全然分からないという。。
おわり
 
  
  
  
  
コメント