Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
function test(x: number, y: number): boolean;
function test(x: string, y: number): boolean;
function test(x: number, y: string): boolean;
function test(x: string, y: string): boolean;
function test(x: any, y: any): boolean {
if (typeof x === "number") {
// ...
} else {
// ...
}
// ...
}
function test(x: number|string, y: number|string): boolean {
// ...
}
function print( node : HTMLElement | null ) : HTMLElement {
if( node === null ) node = document.createElement('div')
node.innerHTML = 'qwerty'
return node
}
var e = equal(42, 'hello');
any — это просто способ сказать компилятору, чтобы он не проверял тип и ты берешь за это ответственность на себя. Т.е. он перестает «ругаться» если ты будешь делать с переменной этого типа что-нибудь странное.T. Приведение типов к общему предку тут не только неинтуитивно, но недопустимо — оно ломает проверку типизации, например:function push2<T>(data: T[], a: T, b: T) {
data.push(a);
data.push(b);
}
push2([1], true, "test"); // работает!
[1].push(true); // ошибка типизации
[1].push(true); // ошибка типизации
push2([1], true, "test"); // работает!
any.function push2 < T > ( data: T[], a: T, b: T ) { }
function push2 < DataType , AType extends DataType , BType extends DataType > ( data: DataType[], a: AType, b: BType ) { }
interface A {
valueOf : () => string
}
interface B {
valueOf : () => number
}
interface AandB {
}
interface AorB {
valueOf : () => any
}
function parseTime( time : number | string | Date ) : number {
// typeof time === Number or String or Date
if( typeof time === 'number' ) return time
// typeof time === not( Number ) and ( Number or String or Date ) )
// typeof time === String or Date
if( typeof time === 'string' ) time = new Date( time )
// typeof time === Date or ( not( String ) and ( String or Date ) ) )
// typeof time === Date
return time.getTime()
}
function push<T>(data: T[], a: T): void {
data.push(a); // здесь в data заносятся данные, т.е. подойдут типы >=T, т.е. T - контравариантен
}
push([1], "string") — общий тип не может быть найден.push(animals, dog) — тип T должен быть выведен как Animal.interface CustomizedFunction<...TArgs, TResult> {
(...args: ...TArgs): TResult;
customProperty: number;
}
interface IEvent<...TArgs> {
type TListener = (...args: ...TArgs) => void;
addListener(listener: TListener): void;
removeListener(listener: TListener): void;
}
interface IObservableArray<T> {
type TIndex = number;
added: IEvent<T, TIndex>;
removed: IEvent<T, TIndex>;
changed: IEvent<>;
}
interface Event {
}
interface ItemEvent < KeyType , ValueType > extends Event {
key : KeyType
value : ValueType
}
interface EventManager < EventType > {
listen( handler : ( event : EventType ) => void ) : void
forget( handler : ( event : EventType ) => void ) : void
}
interface ObservableArray < ItemType > {
added : EventManager < ItemEvent < number , ItemType > >
removed : EventManager < ItemEvent < number , ItemType > >
changed : EventManager < Event >
}
array.added(event => { if (event.key == "...") event.value... });
interface Q {
async<...TArgs, TRes>(fn: F<...TArgs, TRes>): F<...TArgs, Promise<TRes>>;
}
interface F<...TArgs, TRes> {
(...args: ...TArgs): TRes;
}
/**
* This is an experimental tool for converting a generator function into a deferred function. This has the potential of reducing nested callbacks in engines that support yield.
*/
export function async<T>(generatorFunction: any): (...args: any[]) => Promise<T>;
interface Q {
async < TRes > ( gen : () => TRes ) : { () : Promise<TRes> };
async < TRes , T1 > ( gen : ( a1 : T1 ) => TRes ) : { ( a1 : T1 ) : Promise<TRes> };
async < TRes , T1 , T2 > ( gen : ( a1 : T1 , a2 : T2 ) => TRes ) : { ( a1 : T1 , a2 : T2 ) : Promise<TRes> };
async < TRes , T1 , T2 , T3 > ( gen : ( a1 : T1 , a2 : T2 , a3 : T3 ) => TRes ) : { ( a1 : T1 , a2 : T2 , a3 : T3 ) : Promise<TRes> };
}
interface F<R> { ... }
interface F<T1, R> { ... }
interface F<T1, T2, R> { ... }
...
Анонс новых возможностей Typescript 1.4