我有以下代码:
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
有什么区别?
答案 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;
};
使用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;