我认为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很少同时具有匿名和命名功能。 这是对的吗?
答案 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 types
。
https://github.com/Microsoft/TypeScript/blob/master/doc/spec.md#334-function-types很有帮助。
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,
}
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};