通常の使用法で動作するコードを宣言生成(または宣言を手動で記述)で使用しようとしました。ジェネリックのクラスを.d.tsに返すジェネリックでの関数
function createClass<T>(data: T)
{
abstract class Internal<T2>
{
public constructor(arg: T2)
{
console.log(data, arg);
}
protected abstract method(arg: T): void;
}
return Internal;
}
問題は、私は関数の結果の型を指定する必要があることですが、私はこれを行う方法を知らない - 私は別のオプションを試してみましたが、どれも働いていない:コードは次のようです。
を追加しました:
この小さな例では、完全には明らかではないかもしれないので、私は、問題が発生して、元のコードを追加します。
オリジナルコード、私はパッケージに変身しようとしていることあなたがそこに見つけることができるpreact
のhttps://github.com/m18ru/small-redux/blob/master/src/createStore.ts
コード::あなたがそこに見つけることができるsmall-redux
のhttps://gist.github.com/Avol-V/1af4748f4b0774a999311c92b6dc1631
コード:https://github.com/developit/preact/blob/master/src/preact.d.ts
問題は、作成したクラスを使用するたびにTStateタイプを指定したくないという問題です。作成されたクラスでは変更できないため、間違っています。
を追加しました:だから
、私は( - class Internal<TInternal, T2>
さらにT2
に)作成したクラスのジェネリックで明示的にT
を指定しないように任意の解決策を見つけることができませんでした。私の結果コードは次のようになります。https://github.com/m18ru/preact-small-redux/blob/85c143e851b92c44861dc976ce6ef89bcda2c884/src/index.ts
あなただけのジェネリックを持つクラスを返す関数を書きたい場合は@baryoが示唆するように、あなたは(いくつかのクリーンアップで)これを行うことができます。
declare abstract class AbstractInternal<T>
{
public abstract method(arg: T): void;
}
function createClass(): typeof AbstractInternal
{
abstract class Internal<T> implements AbstractInternal<T>
{
public abstract method(arg: T): void;
}
return Internal;
}
const A = createClass();
class B extends A<string>
{
public method(arg: string): string
{
return 'Hello ' + arg;
}
}
良い仕事!私があなたが変更する必要があると思うユニークなものは、 'IInternal'インターフェースです。このメソッドを実装するために 'A'クラスを強制する抽象クラス' method(arg:T):void'を持つ抽象クラスである必要があります。 –
Diullei
ありがとう!関数のスコープ付き 'data'パラメータにアクセスすることはできません。 – baryo
はい、そうです。それを見てhttps://gist.github.com/Diullei/21ad4fe56cd51e9330c998995d17a23e – Diullei