似乎有两种方法可以在Typescript中的接口中声明一个命名函数:
export interface Zoo {
foo(): string
readonly bar: () => string,
}
两个问题:
更新:
这是一个较长的例子:
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更早的回答说它们是等效的,除了可能超载。
答案 0 :(得分:2)
它们都有效并生成相同的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'.
总结:
代码编译完成后,没有。之前,typescript使用bar
作为属性,fpo
作为函数。
因为函数不能有readonly修饰符