似乎有两种方法可以在Typescript中的接口中声明一个命名函数:
export interface Zoo {
foo(): string
readonly bar: () => string,
}
两个问题:
> foo和bar函数有什么区别?
>为什么只有bar才能有readonly修饰符?
更新:
这是一个较长的例子:
export interface Zoo {
foo(): string
readonly bar: () => string,
}
export const x: Zoo = {
foo: () => "a",
bar: () => "a",
};
x.foo = () => "b"; // No error
x.bar = () => "b"; // Error: Cannot assign to "bar"
对我而言,似乎两种声明方式都是等效的,除非第二种方式可以只读.
我还发现this较老的答案说它们是等效的,除了可能超载.
最佳答案 它们都有效并生成相同的Javascript代码:
exports.x = {
foo: function () { return "a"; },
bar: function () { return "a"; }
};
但实际上,您只能将readonly修饰符分配给属性.
旧的答案仍然有效,第一个可以用于重载,第二个没有:
a.ts(2,5): error TS2300: Duplicate identifier 'myFunction'.
a.ts(3,5): error TS2300: Duplicate identifier 'myFunction'.
a.ts(3,5): error TS2403: Subsequent variable declarations must have the same type. Variable 'myFunction' must be of type '(s: string) => void', but here has type '(s: number) => void'.
总结一下:
> foo和bar函数有什么区别?
代码完成(反式)编译后,没有.之前,打字稿使用baras属性,fpo作为函数.
>为什么只有bar才能有readonly修饰符?
因为函数不能有readonly修饰符