TypeScript 中的“构造函数”、“静态”和常规接口有什么区别?

逻辑分支

TypeScript 有两个字符串接口,称为StringStringConstructor

此外,TypeScript语言规范在第 1 章第 1.3 节中提供了此代码示例:

interface JQuery {
  text(content: string);
}

interface JQueryStatic {
  get(url: string, callback: (data: string) => any);
  (query: string): JQuery;
}

JQuery/JQueryStaticString/StringConstructor接口和 doStaticConstructor接口相关有什么区别

编辑:是的,我知道链接的书已经过时了3 年

杰卡兹

我要从 切换StringRegExp因为有一个皱纹String我稍后会提到*


实例接口(如RegExpJQuery)通常表示可以存在多个不同实例的对象类型。关联的静态接口(如RegExpConstructorJQueryStatic)通常表示创建返回这些实例的对象类型并且通常这些静态对象中只有一个存在。所以只有一个RegExpConstructor物体可以制造很多RegExp物体,也只有一个JQueryStatic物体可以制造很多JQuery物体。

实践中一种常见的混淆来源是值和类型之间的名称冲突单个静态对象的名称(例如,RegExpjQuery)往往与实例接口的名称相同。但是那个静态对象的类型不是实例接口的类型。因此,在运行时命名RegExp的类型为RegExpConstructor,而不是RegExp并且在运行时命名jQuery的类型是JQueryStatic,而不是JQuery这令人困惑,但可能是最好的,因为它允许您在运行时x instanceof Y和编译时说出类型xY.

无论如何,如果存在其行为取决于特定实例的属性或方法,则通常位于实例接口上。如果某些属性或方法的行为不依赖于特定实例,则通常位于静态接口上。


构造器接口是一个静态接口,它专门允许您使用其new运算符来创建新实例。在 TypeScript 中,这类似于函数调用签名,但名称为new,如下所示:

type F = (x: string) => number[];
type C = new(x: string) => number[]; 

类型F表示一个函数,它接受一个string参数并生成一个numbers数组,而类型C表示一个构造函数,它接受一个string参数并生成一个numbers数组

declare const f: F;
declare const c: C;
const arr1 = f("hey"); // number[]
const oops1 = new f("hey"); // error, f is not newable
const arr2 = new c("hey"); // number[]
const oops2 = c("hey"); // error, c is not callable

有一个静态接口同时也是一个构造器接口是很常见的;所有class静态接口都是构造函数接口。但并非每个静态接口都是构造函数接口。JQueryStatic接口是一个的例子,其是没有的。要从对象中获取JQuery实例JQueryStatic,您可以像调用函数一样调用它(这就是(query: string): JQuery;签名的含义)。

所以这就是JQueryStatic/JQuery对和RegExpConstructor/RegExp之间的主要区别,也是问题的主要答案的结尾。


*回到String皱纹。命名的类型String特指通过调用构造函数上的运算符构造对象还有一个名为(带有小写的 's')的类型,它指的是原始数据类型。实际上,您处理的所有字符串都是 type 的原语,而 a是一个相对不常见的包装对象,它包含一个值。A和 a大多可以互换:newStringstringstringStringstringstringString

const stringPrimitive = "hello"; // type is string
const stringObject = new String("hello"); // type is String
console.log(stringPrimitive+"!"); // "hello!"
console.log(stringObject+"!"); // "hello!"
console.log(stringPrimitive.charAt(4)); // "o"
console.log(stringObject.charAt(4)); // "o"

除非它们不可互换:

console.log(typeof stringPrimitive); // "string"
console.log(typeof stringObject); // "object"
console.log(stringPrimitive instanceof String); // false
console.log(stringObject instanceof String); // true

当您意识到StringConstructor也可以像函数一样被调用并生成一个原语 时,情况变得更加混乱string

console.log(typeof "hey"); // "string"
console.log(typeof new String("hey")); // "object"
console.log(typeof String("hey")); // "string"

所以这很混乱。这里的规则几乎总是使用string从不使用String. 这就是为什么我将代码示例从Stringalways-an-object更改为always-an-object RegExp,对此没有原始数据类型 ( typeof /foo/ === "object") 妨碍。


好的,希望有帮助。祝你好运!

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TypeScript中的“声明类”和“接口”有什么区别

在Typescript中,类型和接口有什么区别?

TypeScript接口函数属性:有什么区别?

Typescript中的type和class有什么区别?

Typescript 中的 Boolean 和 boolean 有什么区别?

var和Typescript中的let有什么区别?

TypeScript中的“扩展”和“实现”之间有什么区别

Typescript中的()=> any和{():any}有什么区别

Typescript中的String []和[String]有什么区别?

?:和|有什么区别?在TypeScript中未定义?

TypeScript 中的 `extends A` 和 `extends typeof A` 有什么区别?

Typescript 中的导出和导出有什么区别?

Typescript中的“?:”和“:”符号有什么区别

TypeScript 接口和构造函数

TypeScript:Module和具有静态成员的类有什么区别?

Typescript-null和undefined有什么区别?

在 Typescript 中使用 `:Interface` 和 `as Interface` 有什么区别?

在TypeScript中显式键入通用函数参数与隐式键入之间有什么区别?

TypeScript属性中的readonly和get之间有什么区别?

TypeScript中的混合类型和交集类型有什么区别?

TypeScript中的类型化数组-Array <Foo>和Foo []有什么区别?

TypeScript中的private关键字和private字段有什么区别?

TypeScript中的Map <string,MyObject>和{[index:string]:MyObject}有什么区别?

在 TypeScript 中,“导出类型”和“导出声明类型”有什么区别

TypeScript 中 Record<K, T> 和 { [key: K]: T } 有什么区别?

接口和javascript中的构造函数之间有什么区别?

Typescript中的接口和类之间的区别

静态接口与Java中没有此类关键字的常规接口之间有什么区别?

Typescript中私有和受保护的构造函数的用法是什么