Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
3.5k views
in Technique[技术] by (71.8m points)

ES6的class能和函数表达式那样声明类型吗?

像函数有两种定义类型的方式:

// 函数声明
function sum1(x: number, y: number): number {
  return x + y;
}
// 函数表达式
let sum2: (x: number, y: number) => number = function (x, y) {
  return x + y;
};

那ES6的class能支持第二种的类型定义方式吗?比如下面这个例子的CustomType:

class Clazz1 {
    static read(arg: string): void {}
    constructor(arg: string): void {}
    save(arg: string): void {}
}
const Clazz2: CustomType = class {
    static read(arg) {}
    constructor(arg) {}
    save(arg) {}
}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

不知道你想问的是什么,是问Typescript中表达一个类的写法有没有多种吗


因为从本质上来说,虽然可以使用不同的语法去定义同一种类型,但是不同的语法所表达的含义也是不同的。
比如你举例的函数类型声明,虽然在你的例子中看似是等价的,但是看看下面这种情况呢?

// 函数声明
function sum1(x: number, y: number): void {
  return x + y;
}
// 函数表达式
let sum2: (x: number, y: number) => void = function (x, y) {
  return x + y;
};

注意函数的返回类型从number修改为了void。应该能注意到,在这个例子中,sum1的返回值将会报告错误。
对于sum1而言,申明了这个函数的完整类型,所以不管是参数还是返回值都将被类型约束。只要有不符合的类型就会报错;
对于sum2而言,并未申明匿名函数的类型,而是申明了sum2这个变量的类型。当匿名函数被赋值到sum2时,进行类型推导,只要类型没有不兼容的部分(注意不是约束),那么就不会报错。


所以,如果是问完全与类申明等同的,那肯定没有。
如果你只是问,有没有其他类的申明方式,那么是有的。比如

interface Clazz2 {
  save(arg);
}

interface Clazz2Constructor {
  new (arg): Clazz2;
  read(arg);
}

type StaticRead = Clazz2Constructor["read"];
type Clazz2Instance = InstanceType<Clazz2Constructor>; // Clazz2
type save = Clazz2Instance["save"];

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...