Nat*_*ley 22 interface class typescript
我在查找TypeScript类和具有相同名称的接口之间看似特殊关系的任何明确文档或解释时遇到了一些麻烦.
码:
// Co-named interface and class doesn't like readonly property implementation:
interface Foo {
readonly x: number; // Error: Duplicate identifier 'x'
y: number;
}
class Foo {
get x(): number { // Error: Duplicate identifier 'x'
return 0;
}
y = 1;
}
// Same as above, but different class name + explicit `implements`
class Bar implements Foo {
get x(): number { // No error!
return 0;
}
y = 1;
}
// Duplicating the first example, but explicitly implementing the co-named interface:
interface Baz {
readonly x: number; // Error: Duplicate identifier 'x'
y: number;
}
class Baz implements Baz {
get x(): number { // Error: Duplicate identifier 'x'
return 0;
}
y = 1;
}
Run Code Online (Sandbox Code Playgroud)
y2b*_*2bd 24
将合并模块中相同名称的接口:
interface Foo {
x: number;
}
interface Foo {
y: string;
}
let g = {} as Foo;
g.x; // OK
g.y; // OK
Run Code Online (Sandbox Code Playgroud)
类声明同时创建构造函数和类型声明,这实际上意味着所有类都可以用作接口.
class Bar {
y: number;
}
interface IBaz extends Bar { } // includes y: number
class CBaz implements Bar {
y: number = 5;
}
Run Code Online (Sandbox Code Playgroud)
因此,具有相同名称的类和接口相当于具有两个具有相同名称的接口,并且如果接口的两个实例重新声明具有不同类型的相同成员,则会发生合并冲突.
奇怪的是,Typescript将允许这样:
export interface Foo {
readonly x: number;
}
export class Foo {
readonly x: number = 3;
}
Run Code Online (Sandbox Code Playgroud)
但它不会允许,get x() { return 3; }
即使这两个生成为readonly x: number
,所以我只能想象类型检查器在合并期间认为它们是不同的,即使它们在语义上是相同的(这就是为什么你可以扩展接口并指定readonly属性)作为一个吸气功能).
归档时间: |
|
查看次数: |
4373 次 |
最近记录: |