2014-02-03 1 views
1

В качестве примера, скажем, у меня есть этот код:Возможно ли ограничение на контекст функции?

class MyClass { 
    constructor(public myText: string) { 
    } 
} 

// enforce the context to be of type MyClass for this function 
function myFunction() { 
    alert(this.myText); 
} 

var myObject = new MyClass("Hello"); 
myFunction.call(myObject);    // good 
myFunction();       // bad 

Есть ли способ, в машинописном, чтобы ограничить переменную this, чтобы всегда быть объектом класса MyClass? Это было бы полезно для взлома некоторых ошибок во время компиляции.

ответ

2

Это возможно в TypeScript 2.0+. Вы используете this: Type аннотацию в качестве первого аргумента функции:

class MyClass { 
    constructor(public myText: string) { 
    } 
} 

// enforce the context to be of type MyClass for this function 
function myFunction(this: MyClass) { 
    alert(this.myText); 
} 

var myObject = new MyClass("Hello"); 
myFunction.call(myObject);    // good 
myFunction();       // bad 
+0

Спасибо, и это очень плохо. Было бы здорово определить его как методы расширения C#: 'function myFunction (this myObject: MyClass) {alert (myObject.myText); } ' –

+0

Хорошо, что это поддерживается сейчас. '--noImplicitThis' - тоже полезное дополнение. –

+0

Я не поклонник методов расширения и других глобалов. Мне нравится, когда файл полностью понятен, просто глядя на него на github. Все импорты находятся прямо там, и вы знаете, как * любой * проект * тикает * :) – basarat

1

Если вы не можете передать ссылку на объект непосредственно к функции, а не полагаться на this является правильным, ниже немного другой подход, вы могли бы быть в состоянии использовать в некоторых случаях:

module Test { 
    export class Example { 
     Test1(): void { 
      // code here 
     } 
    } 

    export function myFunction():void { 
     if (this instanceof Example) { 
      var asExample: Example = <Example>this; 
      asExample.Test1(); 
     } 
    } 
} 

var ex = new Test.Example(); 
Test.myFunction.call(ex); 
Test.myFunction(); 

используя instanceof, вы можете ограничить звонящим только объекты, которые на самом деле являются экземплярами Example, как показано выше. Вы можете сделать это одним лайнером, чтобы выполнить проверку типа и литье:

export function myFunction():void { 
    var that = assertType<Example>(this, Example); 
    that.Test1(); 
} 

function assertType<T>(obj:any, cls: any): T { 
    if (obj instanceof cls) { 
      return <T>obj; 
    } 
    alert("Type mismatch"); 
    return null; 
    //throw new Error('Type mismatch'); 
} 
Смежные вопросы