TypeScript接口是否具有匿名和命名功能?

时间:2016-12-11 03:48:10

标签: typescript

我认为Interface很少同时具有匿名和命名功能。这是正确的吗?

TypeScript编译器允许接口同时具有匿名和命名功能。

// no error
interface Foo {
  (x: number, y: number): number; // anonymous
  namedMethod: (z: string, w: string) => string; // named
}

但似乎无法使用。

// badProp is not assignable
const foo1 : Foo = {
  badProp(x: number, y: number) { return 1 },
  namedMethod(a: string, b: string) { return 'str'; }
}

// syntax error
const foo2 : Foo = {
  (x: number, y: number) { return 1 },
  namedMethod(a: string, b: string) { return 'str'; }
}

使用any类型,它可以正常工作。

const temp: any = function (x: number, y: number) { return 1 };
temp.namedMethod = function (a: string, b: string) { return 'str'; }
const foo3: Foo = temp;

虽然使用两者在技术上是可行的,但Interface很少同时具有匿名和命名功能。 这是对的吗?

3 个答案:

答案 0 :(得分:2)

TypeScript接口中的“未命名”成员不引用匿名成员,而是声明接口类本身的函数签名as described in this section of the documentation

例如:

Items

答案 1 :(得分:1)

TypeScript允许接口具有混合类型,即接口可以具有属性,函数声明,索引器和方法的组合。允许这种灵活性与JavaScript动态特性保持一致。

interface Foo {
    (x: number, y: number): number; // anonymous
    namedMethod: (z: string, w: string) => string; // named
    randomNumber: number
}

const foo2 = ((x: number, y: number) => x+ y + 1) as Foo;
foo2.namedMethod = (z: string, w: string) => z;
foo2.randomNumber = 4
console.log(foo2(1, 3)); // prints 5
console.log(foo2.namedMethod('hello', 'world')); // prints 'hello'
console.log(foo2.randomNumber); // prints 4

答案 2 :(得分:0)

双向可以写Function typeshttps://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#334-function-types很有帮助。

1。在对象类型文字中调用签名。

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#392-call-signatures

// call signatures is like this.
(x: number, y: number): number,

接口以声明函数类型

spec

  

由于函数和构造函数类型只是包含调用和构造签名的对象类型,因此可以使用接口来声明命名函数和构造函数类型。

所以我可以写这个。

// interface with call signatures
interface TwoNumberFunctionInterface {
  (x: number, y: number): number,
}

2。函数类型文字。

https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#388-function-type-literals

// function type literal is like this
let a: (x: number, y: number) => number;

function type literal是包含单个调用签名的对象类型的简写。

// object type containing a single call signature
let a: {(x: number, y: number): number};