TypeScript:对任何对象调用prototype原型方法 - 更短的语法?

时间:2018-02-28 00:29:04

标签: typescript

在TypeScript(不是Java,C#或Objecive-C)中,下面的代码是否有更短的语法(类似于:: bind运算符)?

> myfiles <- list.files("C:\\Documents\\R\\wd\\text")
> myfiles
[1] "111 - Copy (2).txt" "111 - Copy (3).txt" "111 - Copy (4).txt" "111 - Copy (5).txt"
[5] "111 - Copy (6).txt" "111 - Copy.txt"     "111.txt"



> list.files(path= myfiles, pattern = "Also")
character(0)

下式给出:

./ Company.ts

const company = { rating: 5 }
Company.prototype.getRating.call(company) // <----- NEED A SHORTER SYNTAX

是否有一种替代的较短语法,我可以告诉人们要遵循,或者我应该让他们做多长.prototype。仅限语法?

这样的事情:

class Company {
  rating: string;

  getRating() {
    return this.rating + " stars";
  }
}

最好是:

((Company)company).getRating(); // or (company as Company).getRating();

2 个答案:

答案 0 :(得分:4)

问题是company对象不是Company的实例,它只是一个对象文字。你可以做以下几件事之一:

使用Object.assign将属性分配给Company的实例:

const company = Object.assign(new Company(), { rating: 5 })
company.getRating();

创建一个调用Object.assign的构造函数:

class Company {
    rating: number;
    constructor(data: Partial<Company>){
        Object.assign(this, data);
    }
    getRating() {
      return this.rating + " stars";
    }
  }

const company = new Company({ rating: 5 });
company.getRating();

或者您可以使用更改对象原型的函数(尽管如果Company具有构造函数,这可能会导致问题,因为对于通过cast的对象,构造函数不会被执行,更改__proto__很慢):

function cast<T>(obj, type: { new(...args): T }): T {
    obj.__proto__ = type.prototype;
    return obj;
}
const company = cast({ rating: 5 }, Company);
company.getRating();

答案 1 :(得分:0)

TypeScript的目的不是简单地写东西,而是为了提高可读性,启用IDE和编写可扩展代码。 无论如何,编译的js代码将比vanilla js更长,因此比较哪一行更短是没有意义的。

这应该有效:

const company = new Company(); 
company.rating = 5; 
company.ratingString; 

在你班上:

class Company {
  rating: number;

  get ratingString() {
    return this.rating + " stars";
  }
}

注意: 类中的rating是一个字符串,但在公司对象中是数字,它不匹配。