Typescript接口声明中命名函数语法的区别

时间:2017-05-13 11:35:15

标签: typescript

似乎有两种方法可以在Typescript中的接口中声明一个命名函数:

export interface Zoo {
  foo(): string
  readonly bar: () => string,
}

两个问题:

  1. foo和bar函数有什么区别?
  2. 为什么只有bar才能有readonly修饰符?
  3. 更新:

    这是一个较长的例子:

    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更早的回答说它们是等效的,除了可能超载。

1 个答案:

答案 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'.

总结:

  1. foo和bar函数有什么区别?
  2. 代码编译完成后,没有。之前,typescript使用bar作为属性,fpo作为函数。

    1. 为什么只有bar才能有readonly修饰符?
    2. 因为函数不能有readonly修饰符