创建具有指定类型的泛型函数的实例

时间:2018-03-11 14:04:12

标签: typescript

我想要实现的是这样的:

function genericFunc<T>(arg: T): T {
    return arg;
}

//this line won't work, but it's the essence of what I need
var stringFunc = genericFunc<string>;

stringFunc('myStr')

是否可以创建具有指定类型的泛型函数的实例?

我知道的唯一方法是创建一个界面 -

interface GenericFnInterface<T> {
    (arg: T): T;
}

let stringFunc : GenericFnInterface<string> = genericFunc;

但我想避免创建太多的接口。是否有更短的方法来实现相同的

_

UPD 我发现的另一种方式是

var stringFunc: <T extends string>(arg:T) => T = genericFun;

但它仍然不完美,因为它会产生更复杂类型的混乱。

1 个答案:

答案 0 :(得分:2)

您可以(隐式或显式)投射:

<pl.bclogic.pulsator4droid.library.PulsatorLayout
    android:id="@+id/pulsator_1"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_marginLeft="144dp"
    android:layout_marginTop="176dp"
    app:pulse_count="5"
    app:pulse_duration="3000"
    app:pulse_repeat="0"
    app:pulse_color="#FF8F00"
    app:pulse_startFromScratch="false"
    app:pulse_interpolator="Decelerate">
</pl.bclogic.pulsator4droid.library.PulsatorLayout>

<pl.bclogic.pulsator4droid.library.PulsatorLayout
    android:id="@+id/pulsator_2"
    android:layout_width="80dp"
    android:layout_height="80dp"
    android:layout_marginTop="232dp"
    android:layout_marginLeft="12dp"
    app:pulse_count="5"
    app:pulse_duration="3000"
    app:pulse_repeat="0"
    app:pulse_color="#FF8F00"
    app:pulse_startFromScratch="false"
    app:pulse_interpolator="Decelerate">
</pl.bclogic.pulsator4droid.library.PulsatorLayout>

declare function identity<T>(arg: T): T; // implementation irrelevant

const x: (arg: string) => string = identity; // implicit cast

x('hello'); // ok
x(42); // error

建议使用前者,因为如果你在演员阵容中犯了错误,它会抓住你:

declare function identity<T>(arg: T): T;

const x = identity as (arg: string) => string; // explicit cast

x('hello'); // ok
x(42); // error