是否可以使用TypeScript中的属性定义不带类型断言或中间值的函数?

时间:2019-05-27 15:04:55

标签: typescript javascript-objects

TypeScript可让您定义一个既可调用又具有属性的接口:

interface FnWithProps {
    (x: number): number;
    a: string;
    b: string;
}

这是创建可分配给该接口的值的一种方法:

function double(x: number) {
    return x * x;
}
double.a = 'Hello';
double.b = 'Goodbye';

let f: FnWithProps = double;  // ok

如果未设置double.adouble.b,则会触发错误。

是否可以直接构造这样的值,而无需通过中间变量或使用类型声明?

这不是有效的TypeScript,并会触发各种错误:

let g: FnWithProps = {
    (x: number) => x,
    a: 'Hello',
    b: 'Goodbye',
};

2 个答案:

答案 0 :(得分:1)

我认为中间解决方案可能也是最好的,因为它也可以很好地处理重载,但是您也可以使用Object.assign来获得类似的效果:

let f: FnWithProps = Object.assign(function double(x: number) {
    return x * x;
},{
    a : 'Hello',
    b : 'Goodbye'
}); 

尽管这确实意味着我们无法对函数参数或属性进行推断。

如果这是您的常见情况,我们可以构建一个实用程序函数来推断所有内容:

interface FnWithProps {
    (x: number): number;
    a: string;
    b: string;
}

function functionWithProps<T extends (...a: any[]) => any>(fn: (...a: Parameters<T>) => ReturnType<T>, props: Pick<T, keyof T>){
    return Object.assign(fn, props);
}

let f = functionWithProps<FnWithProps>(function double(x) { // annotation not necesary
    return x * x;
},{
    a : 'Hello', // helpful intelisense here
    b : 'Goodbye'
}); 

答案 1 :(得分:0)

编辑:使用原始帖子中的 ... # socket=MYSQL port=3306 [mysql] no-beep= default-character-set=utf8 # default-character-set= # SERVER SECTION # ---------------------------------------------------------------------- # # The following options will be read by the MySQL Server. Make sure that # you have installed the server correctly (see above) so it reads this # file.= # # server_type=2 [mysqld] collation-server = utf8_unicode_ci character-set-server = utf8 # The next three options are mutually exclusive to SERVER_PORT below. # skip-networking= # enable-named-pipe= # shared-memory= ...

interface FnWithProps

Demo in typescript playground

这里要注意的是函数定义的interface FnWithProps { (x: number): number; a: number; b: number; } const g:FnWithProps = (()=>{ const obj={ a:2,b:3, func:function(x:number){ return this.a*x+this.b} } return obj.func.bind({a:obj.a,b:obj.b}) as FnWithProps })() console.log(g(1)) this。这是防止与此相关的错误所必需的。但是,从obj中取出后,这个obj就丢失了!所以用bind代替了。 (赋值也可以)。

顺便说一句,使用 this 的替代方法如下:

interface