有什么区别让f:F = f`和`let f = <f> f`

时间:2017-01-25 18:22:34

标签: typescript

我有以下代码:

interface F {
    (): string;
    a(): number;
}

function f() {
    return '3';
}

f['a'] = function () {
    return 3;
};

然后我想为变量分配一个函数。我可以这样做:

let z = <F>f; // works

或者像这样:

let y: F = f; // doesn't work

有什么区别?

2 个答案:

答案 0 :(得分:3)

根本问题是f只是一个函数,您尝试使用它,就像它是一个接口的实例一样。 (而且我认为很好,它与界面兼容,它只是一种语法问题。)

这很好:

let z = <F>f; // works

...因为它使用强制转换来告诉TypeScript虽然f只是TypeScript知道的函数,但你知道的更好,它与接口{{{{1}兼容1}}。然后类型推断发挥作用并将类型F分配给F,因为作业的右侧属于z类型。

但是这个:

F

...之所以无效,是因为它将let y: F = f; // doesn't work 声明为y类型,然后为其分配函数。该函数不是F类型,因此赋值失败。

答案 1 :(得分:1)

我就是这样做的:

interface F {
    (): string;
    a(): number;
}

function f() {
    return '3';
}

let f1 = f as F;
f1.a = function () {
    return 3;
};

code in playground

使用as F相当于<F>,它被称为type assertion

修改

是的,您可以将f定义为类型F,如下所示:

let f3 = function() {
    return "3";
} as F;

f.a = function () {
    return 3;
};

或使用箭头功能:

let f = (() => {
    return "3";
}) as F;