Axios: 応答むンタヌセプタヌを䜿甚するずきにTypeScriptでAxiosを䜿甚する方法AxiosResponseの問題

䜜成日 2018幎04月30日  Â·  50コメント  Â·  ゜ヌス: axios/axios

抂芁

TypeScriptTSに移行するプロゞェクトでは、応答むンタヌセプタヌr => r.dataがありたす。 AxiosResponseのタむプを期埅しおいないこずをTSに通知するにはどうすればよいですか as Array<...を䜿甚しおオヌバヌラむドしようずしたしたが、 AxiosResponseをArrayずしおキャストできないため、機胜したせんたずえば、.lengthがありたせん。

ありがずう

環境

  • axiosバヌゞョン0.16.2
  • 環境Visual Studio Code

最も参考になるコメント

axios.d.tsのAxiosResponseをオヌバヌラむドしたす

import axios from 'axios'

declare module 'axios' {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}

党おのコメント50件

axios.request<T>(...args)スタむル定矩を䜿甚したす。
配列内の最埌のResponse-interceptorは、 (currentResponse: any) => Tのようなむンタヌフェむスに暗黙的に準拠しおいたす。

したがっお、 dataが次のようなものである堎合

interface ServerResponse {
  data: ServerData
}

interface ServerData {
  foo: string
  bar: number
}

次に、あなたは蚀うこずができたす

axios.request<ServerData>({
  url: 'https://example.com/path/to/data',
  transformResponse: (r: ServerResponse) => r.data
}).then((response) => {
  // `response` is of type `AxiosResponse<ServerData>`
  const { data } = response
  // `data` is of type ServerData, correctly inferred
})

@zcei ooh実際、これはグロヌバルむンタヌセプタヌでは機胜したせん。䟋 axios.interceptors.response.use

私はそう思いたす-むンタヌセプタヌは珟圚非垞に「リラックスした」タむプ別名any なので、応答むンタヌセプタヌを接続しお(r: any): any => r.dataにするこずができたすこれは基本的には非厳密モヌドでの入力は省略しおください。

axios.requestを呌び出した時点でのみ、ゞェネリックを構成できたす。ゞェネリックは、 dataプロパティのタむプずしお枡されたす。

実際、䞊蚘のコヌドスニペットを間違えたした。 dataは実際にはAxiosResponse<ServerData>であり、タむプServerDataの.dataずいうフィヌルドがありたす-曎新したした

@zceiこんにちは、申し蚳ありたせんが、これは私の䟋では実際には機胜したせん。この問題を匷調するためのコヌドサンドボックスを䜜成したした。

こちらをチェックしおください

同じ問題があるため、むンタヌセプタヌは基本的に次のように芁玄できたす。

this.instance.interceptors.response.use(response => response.data);

それにもかかわらず、リタヌンタむプの

this.instance.post<string>(...);

はAxiosPromise<string>であり、デヌタがラップされるこずを想定しおいたす。

これは意図的にです。 むンタヌセプタヌでデヌタを倉換するこずになっおいたすが、応答キヌを䞊げるこずはできたせん。

https://github.com/axios/axios/blob/0b3db5d87a60a1ad8b0dce9669dbc10483ec33da/lib/core/dispatchRequest.js#L63 -L67

私はあなたが次のようなサヌバヌ応答を持っおいるず思いたした

{
  "data": {
    "foo": 42
  }
}

response.data.dataの入れ子を取り陀きたいず思っおいたした。 むンタヌセプタヌでresponse.dataを返すず、埌でresponse.data.data.foo response.data.fooを介しおアクセスできたす。

ただし、 response.fooぞのアクセスは機胜したせん。これは、応答コヌドなどの他のものを远跡する「ルヌト」応答レベルであるためです。

申し蚳ありたせんが、少なくずも機胜面では、あなたの前提に同意したせん。
むンタヌセプタヌを䜿甚しおデヌタプロパティをアンラップしないず、

this.instance.post<string>(...).then(response => response.data);
this.instance.get<number>(...).then(response => response.data);

私が定矩する_every_゚ンドポむントで。 そのすべおのコヌドの繰り返しのポむントは䜕ですか

リク゚ストが成功するたびに、぀たりthenがある堎合は、応答コヌドなどはあたり気にしたせん。䜕かが機胜しなかった堎合にのみ応答コヌドを気にしたす。これが゚ラヌハンドラヌの目的です。 、むンタヌセプタヌず特定の゚ンドポむントの䞡方で。

this.instance.interceptors.response.use(response => {
  // Everything went well, pass only relevant data through
  return response.data;
}, error => {
  // Something went wrong, figure out how to handle it here or in a `.catch` somewhere down the pipe
});

リク゚ストが成功するずきはい぀でも、それはそれを意味したす、私は応答コヌドを本圓に気にしたせん

さお、あなたは他の情報を気にしないかもしれたせんが、あなたが䜓だけを気にするHTTPクラむアントを䜿甚するすべおの人に制玄するこずは実際には解決策ではありたせん。
通話が成功した堎合でも、ステヌタスコヌドずヘッダヌには十分な正圓なナヌスケヌスがありたす。 204ず200を区別する、レヌト制限ヘッダヌを確認する、远加のリ゜ヌス甚にLinkヘッダヌを抜出するペヌゞネヌションなどのように。

気にしない堎合は、Axiosをラップしお、すべおを砎棄したす。

this.instance.request = <T>(...args) => {
  return axios.request<T>(...args).then(({ data }) => data)
}

this.instance.request<string>({ method: 'post', ... }).then(data => { ... });
this.instance.request<number>({ method: 'get', ... }).then(data => { ... });

誰もが1぀のプロゞェクトで私ず同じように物事を行うべきだずいう考えをどこで埗たのかわかりたせん。 私は単に、リク゚ストごずにデヌタを自動的にアンラップする方法の問題を解決しようずしおいたす。この問題が私の前にあったこずを考えるず、その問題を抱えおいるのは私だけではありたせん。

むンタヌセプタヌは、名前ずreadmeでの説明の䞡方で、それを行うための正しい堎所が奜きですすべおの応答で䜕かを行いたす。 204ず200などを凊理しおからデヌタを枡すこずも、むンタヌセプタヌで意味がありたす。これは、1぀の䞭倮の堎所で行うこずができるためです。

私の意芋では、盎感的な解決策は、ラむブラリに䞀方向に匷制させるのではなく、むンタヌセプタヌから必芁なものを返すこずです。

デヌタの䞀郚のフィヌルドを倉換する堎合

this.instance.interceptors.response.use(response => {
  response.data.foo = JSON.parse(response.data.bar);
  return response;
});

Axiosのデヌタをアンラップするだけの堎合

this.instance.interceptors.response.use(response => response.data);

これは開発者に䜕をするかの遞択を任せたす、それは私の意芋では非垞に匷く意芋のあるむンタヌセプタヌよりも優れおいたす。 もちろん、あなたは自由に反察するこずができたす。

あなたは「そのすべおのコヌドの繰り返しの芁点」に぀いお掚論しおいたので、私は情報が必芁な理由を説明しようずしたした。

むンタヌセプタヌが共通の構造なしで応答党䜓をスクランブルできる堎合、むンタヌセプタヌず応答で型安党性を維持する方法を実際に芋぀けるこずはできたせん。 /
リク゚ストの応答タむプはanyになる必芁がありたす。私は掚枬し、開発者が正しいこずを行うように努力したす。

それは、少なくずも1぀のプロパティにアクセスするよりも、タむプが緩和されおいるために゚ラヌが発生しやすいように思えたす。

「80のナヌスケヌス」の型安党性を維持しながら、むンタヌセプタヌがルヌト応答を䞊曞きできるPRを考え出すこずができれば、私はずおも幞せです。

問題は、私が䜜成した䞊蚘の䟋は䞡方ずも、私が説明したように、機胜的にはすでに機胜しおいるずいうこずです。間違っおいるのはタむプだけです。 むンタヌセプタヌで倉曎された応答以倖のものを返すこずが間違っおいる堎合は、そこで期埅されるタむプを曎新するのが良いず思いたす。

たず、 @ Etheryteで同じこずをしおいるこずを知るのは興味深いこずです。

私たちのアプリでは、 r => r.dataがチェヌンの最終応答むンタヌセプタヌであり、曎新トヌクンなどを凊理するためにステヌタスコヌドに䟝存する他のものを䜿甚したすが、特定の目的でこれを凊理する必芁がないため、グロヌバルレベルで䜿甚したす呌び出したす。

TSではこのナヌスケヌスに察応できない可胜性があるこずを理解しおいたす。 ただし、 @ zceiは、Axios APIむンタヌセプタヌの公匏郚分を䜿甚しおいるため、これがAxiosを䜿甚するための正圓な方法であるこずは吊定できたせん:)。

ドヌ 私はい぀も間違ったコヌドを芋おきたした🀊‍♂そしおむンタヌセプタヌではなくtransformResponseセクションにいたした-ごめんなさい

むンタヌセプタヌがリタヌンタむプを倉曎するこずを考慮しお、タむピングをどのように曎新したすか

倚分このようなもの

interface AxiosInstance {
  request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
}

あなたはそれをこのように呌ぶでしょう

axios.request<User, string>({
  method: 'get',
  url: '/user?id=12345'
})
  .then((foo: string) => { // <-- you could leave out the type annotation here, it's inferred
    console.log(foo)
  })

ロヌカルで詊しおみたずころ、探しおいるこずを実行しおいるようです。
たぶん私は倕方に䞀緒にPRを取埗しお、すべおのメ゜ッドのPRを曎新するこずができたす。

@zceiよさそうだ もちろん、デフォルトでAxiosResponseを䜿甚するこずは、99の確率で理にかなっおいたす👍

聞いおよかった 混乱しおすみたせん😓

@zceiは問題ありたせん 興味深いこずに、Axiosのリリヌスサむクルは䜕ですか

䜕もありたせん-v1alpha1333に぀いおはただ保留䞭のものがいく぀かあり、その間、 @ nickuraltsev / @ emilyemorehouseは必芁に応じおリリヌスを行っおいたす。
v0.18以降、ある皋床の牜匕力があり私のお気に入りむンスタンスぞのスコヌプオプションを含む、リリヌスを削枛できるず思いたす。 詳现に぀いおは、 Gitterにご招埅したすので、問題を適切に保぀こずができたす🙂

0.19リリヌスを出すこずを望んでいたしたが、最埌に確認したずころ、マスタヌはCIに倱敗しおいたした。 1.0がリリヌスされたら、より確実で定期的なリリヌススケゞュヌルを確実に望んでいたす。

同じ問題に察応したす。 解決策はありたすか

@qidaneixは、リリヌスが行われるたでnpm install axios/axios#masterをむンストヌルしおみるこずができたす。 1605はそれを修正する必芁がありたした。 テストだけでなく、実際のナヌスケヌスに本圓に圹立぀かどうか、フィヌドバックをいただければ幞いです🙂

@zcei明日やっおみたす

@zceiい぀リリヌスされるのか聞いおもいいですか

1.0.0がリリヌスされるずきに+1

これは確かに1.0より前のリリヌスになりたす。 @KhaledgarbayaもMattによっおNPMに远加されたしたか それ以倖の堎合は、それをリリヌスする残りのメンテナに芪切にする必芁がありたす😉

やあみんな。 私は珟圚、NPMリリヌスを管理しおいたす。 1.0.0より前の別のリリヌスを発行したいのですが、Travisテストが倱敗し、ただ修正する機䌚がありたせん。 それらが修正されたら、私はこれをすぐに出すこずができおずおも幞せです😬

@zcei npmリポゞトリに远加されたせんでした、倉曎をマヌゞするこずしかできたせん

この問題に関する曎新はありたすか2か月目など、近い将来にリリヌスされる予定ですか

+1

❀これが今リリヌスされる可胜性がある堎合

認識しおいたすが、珟圚ブロックされおいたす。 🙁ここで詳现情報を入手できたす https //github.com/axios/axios/issues/1657#issuecomment -410766031

0.19.0-beta.1の䞀郚ずしおリリヌスされたした。

これは、 npm install [email protected]たたはnpm install axios@nextを䜿甚しおむンストヌルできたす

倚分このようなもの

interface AxiosInstance {
  request<T = any, R = AxiosResponse<T>> (config: AxiosRequestConfig): Promise<R>;
}

あなたはそれをこのように呌ぶでしょう

axios.request<User, string>({
  method: 'get',
  url: '/user?id=12345'
})
  .then((foo: string) => { // <-- you could leave out the type annotation here, it's inferred
    console.log(foo)
  })

ロヌカルで詊しおみたずころ、探しおいるこずを実行しおいるようです。
たぶん私は倕方に䞀緒にPRを取埗しお、すべおのメ゜ッドのPRを曎新するこずができたす。

UserT、最初の汎甚パラメヌタヌは䜿甚されおいないようです。カスタムの戻り倀を䜿甚したい堎合は、奇劙に芋えたす😕

axios.request<void, string>({
    ...
})

voidを䜿甚するず、より明確になる堎合がありたす。

@emilyemorehouse恩知らずではありたせんが、0.19ベヌタ版が3か月間オヌプンしおいたすが、GAリリヌスのETAはありたすか 私たちのプロゞェクトには、これらの修正の1぀を必芁ずする問題がありたす。 私はGitterチャンネルでこれを尋ねたしたが、メンテナが向こうで応答しおいるようには芋えたせん...

おそらく、より良い蚀い回しは、リリヌス前に解決する必芁のある問題は䜕であり、それを远跡する堎所はありたすか 倚くの関心があるように思われるので、䜜業を広げ、必芁な䜜業を明確に理解するこずは、物事をスピヌドアップするのに圹立぀可胜性がありたす。

0.19のプロゞェクトマむルストヌンはすでにありたすが、リストされおいるチケットは数か月間倉曎されおいたせん。

const func1any ==> {return axios.request...}

axios.d.tsのAxiosResponseをオヌバヌラむドしたす

import axios from 'axios'

declare module 'axios' {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}

この問題をぶ぀けたす。 それは機胜したす... AxiosInstance定矩をロヌカルタむピングにコピヌしただけで問題ありたせんが、Typescriptの専門家ではなく䜕か間違ったこずをしおいない限り、実装された゜リュヌションは私の意芋では非垞に冗長です。 axios.createで䜜成された別のaxiosむンスタンスを䜿甚しおおり、このむンタヌセプタヌを䜿甚しおいるため、次のようになりたす。

AxiosClient.interceptors.response.use(
  response => response && response.data,
  error => error && error.response && error.response.data
);

ここで、 response.dataは垞に次の圢匏になりたす。

export interface APIResponse<T = any> {
  data: T;
  message: string;
  status: boolean;
}

次のようにAxiosClient.postを䜿甚する必芁があるようです。

AxiosClient.post<EndpointAPIResponse, APIResponse<EndpointAPIResponse>>('/endpoint', { someData });

.thenに適切な型を蚭定したす。 私はここで䜕か間違ったこずをしおいるのでしょうか、それずも本圓に冗長なのでしょうか そうでない堎合は、むンスタンスの䜜成時に期埅される応答スキヌマを枡すこずができればはるかに良いでしょうが、それを機胜させるこずはできたせん。

export interface AxiosInstance<R> {
  <T = any>(config: AxiosRequestConfig): Promise<R<T>>;
  <T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  defaults: AxiosRequestConfig;
  interceptors: {
    request: AxiosInterceptorManager<AxiosRequestConfig>;
    response: AxiosInterceptorManager<R>;
  };
  getUri(config?: AxiosRequestConfig): string;
  request<T = any>(config: AxiosRequestConfig): Promise<R<T>>;
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  head<T = any>(url: string, config?: AxiosRequestConfig): Promise<R<T>>;
  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R<T>>;
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R<T>>;
  patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<R<T>>;
}

export interface AxiosStatic extends AxiosInstance<AxiosResponse> {
  create<T = AxiosResponse>(config?: AxiosRequestConfig): AxiosInstance<T>;
  Cancel: CancelStatic;
  CancelToken: CancelTokenStatic;
  isCancel(value: any): boolean;
  all<T>(values: (T | Promise<T>)[]): Promise<T[]>;
  spread<T, R>(callback: (...args: T[]) => R): (array: T[]) => R;
}

ゞェネリック型がなくおもaxios.create()でも、たたはaxiosだけでも問題なく動䜜したすが、次のようにむンタヌフェむスを枡すず次のようになりたす。

const AxiosClient = axios.create<APIResponse>({
  // ...
});

AxiosClient.post<string>('/endpoint').then(value => value.data) 、 value.dataにはタむプがありたす...T。さらに、䞊蚘のバヌゞョンは、node_modulesでこれらのタむプを実際に眮き換えた堎合にのみ機胜したす。そうしないず、完党に混同されおしたいたす。いく぀かの完党な灜害に終わりたす。 誰かがこれで私を助けるこずができたすか

線集わかりたした、ゞェネリックをそのように䜿甚するこずはできないため、機胜しないず思いたすしたがっお、Rがゞェネリック型の堎合のR<T>は正しい構文ではありたせんが、䜕らかの理由でWebStormが匷調衚瀺されなかったず思いたす私にずっおは; https://github.com/Microsoft/TypeScript/issues/1213これで解決できるず思いたすが、実装されるかどうかはわかりたせん。

const request = <T>(options: AxiosRequestConfig) => {
    return axios.request<IResponse<T>>(options).then<T>(response => {
        const data = response.data;
        if (data.c !== '0') {
            return Promise.reject(new Error(data.m || 'error'));
        }
        return data.d;
    });
}

䜿甚する

request<IApiGetBrandGoodsInfoByIds>({
        method: 'GET',
        url: '/api/a/b',
    });

@zceiこれはもう解決されたしたか フォロヌを機胜させるこずができたせん

// so I created an axios instance:
const instance = axios.create(someOptions);

// then used interceptors
instance.interceptors.response.use((res) => res.data.data);   // server response will always have 'data'

// then when using the following to make a request
instance.get<string>(someURI);  // suppose server response was {data: 'some message'}

// ^^ the above returns type AxiosPromise<string>. How do I get it to return type Promise<string> instead?

同じ問題があり、バヌゞョン0.19betaをむンストヌルしたす。たた、tsは正しいタむプを解析できたせん

axios.d.tsのAxiosResponseをオヌバヌラむドしたす

import axios from 'axios'

declare module 'axios' {
  export interface AxiosResponse<T = any> extends Promise<T> {}
}

ああニりピ

response => response.dataのようなこずをするためにむンタヌセプタヌを䜿甚したす。 したがっお、 AxiosResponseラッパヌを完党に削陀する必芁がありたす。

私は最終的に次のようになりたす

import axios from 'axios'

declare module 'axios' {
  export interface AxiosInstance {
    request<T = any> (config: AxiosRequestConfig): Promise<T>;
    get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
    delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
    head<T = any>(url: string, config?: AxiosRequestConfig): Promise<T>;
    post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
    put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
    patch<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T>;
  }
}

誰かがそれを䜿甚する方法を知らない堎合

  1. タむプをどこかに曞き蟌みたす䟋 src / types / axios / axios.d.ts 。
  2. tsconfig.jsonを曎新したす。䟋
{
  "compilerOptions": {
    "typeRoots": [
        "./node_modules/@types",
        "./src/types/",
    ]
  }
}

これは私のために働きたす

Api.boards.createBoard = jest.fn((name:string) => {
      const mockBoardResult = {
        created_on: mockBoardData.date,
        name,
        threads: [],
        updated_on: mockBoardData.date,
        _id: mockBoardData._id
      };
      return Promise.resolve({data:mockBoardResult}) as Promise<AxiosResponse<any>>
    });

オヌバヌラむドする別の方法

import * as axios from 'axios'

declare module 'axios' {
  interface AxiosInstance {
    (config: AxiosRequestConfig): Promise<any>
  }
}

むンタヌセプタヌを䜿甚する堎合は、むンタヌセプタヌをむゞェクトでき​​るため、 AxiosResponseにプロパティを远加するべきではないず思いたす。

// @axios-exts/add-foo-to-resp
declare module 'axios' {
  interface AxiosResponse<T = any> {
    foo: string
  }
}
const addFooToResp = (res: AxiosResponse) => {
  res.foo = 'bar'
  return res
}
export default addFooToResp
// Your Project
import axios from 'axios'
import addFooToResp from '@axios-exts/add-foo-to-resp'

var id = axios.interceptors.response.use(addFooToResp)

axios.get('xx').then(res => {
  // have type defined
  // because we use `declare module 'axios'` ts can infer type
  console.log(res.foo)
})

// but if then eject?
axios.interceptors.response.eject(id)
axios.get('xx').then(res => {
  // also have type defined, it's maybe not reasonable
  console.log(res.foo)
})

なぜtypescriptを䜿うのですか 私たちのプロゞェクトが安党に行われるこずを願っおいたす。
い぀かベヌスutilsからプロパティを削陀する堎合、それを参照するコヌドがコンパむル時に゚ラヌを生成するようにしたす。

したがっお、むンタヌセプタヌを䜿甚しおAxiosResponseにプロパティを远加し、型掚論を䜿甚する必芁がありたす。これは矛盟しおいたす。むンタヌセプタヌがむゞェクトされたずきに型掚論を曎新できるようにする方法がないためです。

私はaxiosがナヌザヌに䌝えるべきだず思いたす
むンタヌセプタヌはAxiosResponseに圱響を䞎えないものを凊理する必芁がありたす。 AxiosResponseプロパティを拡匵しお型掚論を行う堎合は、「プラグむン」を䜿甚する必芁がありたす。

// @axios-exts/add-foo-to-resp
declare module 'axios' {
  interface AxiosResponse<T = any> {
    foo: string
  }
}
const addFooToResp = (res: AxiosResponse) => {
  res.foo = 'bar'
  return res
}
export default (axios) => {
  axios.interceptors.response.use(addFooToResp)
}
// Your Project
import axios from 'axios'
import addFooToResp from '@axios-exts/add-foo-to-resp'

addFooToResp(axios)

100の安党性ではありたせんが、 axios.interceptors.response.useを䜿甚するよりも安党です。

そしお私はaxiosdesginプラグむンシステムをお勧めしたす、今私たちはい぀も次のように芋えたす

import axios from 'axios'
import wrapper from 'axios-cache-plugin'

let http = wrapper(axios, {
  maxCacheSize: 15
})
export default http

wrapperのように䜿甚しお、プラグむンをaxiosに接続したす。すべおのプラグむンに共通のルヌルはなく、十分に゚レガントではありたせん。 私は奜きなはずだず思いたす

import axios from 'axios'
import axiosCache from 'axios-cache-plugin'

axios.use(axiosCache, {
  // some options
})
export axios
// axios-cache-plugin
export default (axios) => {}
// or
export default {
  install(axios){}
}
// like Vue.use for Vue.js

axios.request<T>(...args)スタむル定矩を䜿甚したす。
配列内の最埌のResponse-interceptorは、 (currentResponse: any) => Tのようなむンタヌフェむスに暗黙的に準拠しおいたす。

したがっお、 dataが次のようなものである堎合

interface ServerResponse {
  data: ServerData
}

interface ServerData {
  foo: string
  bar: number
}

次に、あなたは蚀うこずができたす

axios.request<ServerData>({
  url: 'https://example.com/path/to/data',
  transformResponse: (r: ServerResponse) => r.data
}).then((response) => {
  // `response` is of type `AxiosResponse<ServerData>`
  const { data } = response
  // `data` is of type ServerData, correctly inferred
})

plsはtsxを䜿甚しおAxiosリク゚ストにヘッダヌず構成を远加する方法を教えおくれたす

@MoZiadAlhafez

declare module 'axios' {
  interface AxiosRequestConfig {
    useCache: boolean
  }
}

しかし、これはお勧めしたせん

これは長い話ですが、1605で解決されたようです。 https://github.com/axios/axios/issues/1510#issuecomment-396894600を参照しおください。

私が䜕かを誀解した堎合は、ここを参照しお新しい問題を開く方がよいでしょう。 ありがずう。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡