2017-02-10 1 views
2

Инициализация v2 ниже дает: Type 'T[keyof T]' cannot be converted to type 'number'. Что не так?Как я могу заставить этот тип-тип Typecript работать в контексте общего типа?

private func<T extends Object>(o:T, prop: keyof(T)): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2: number = val as number 
    } 
} 

Это работает в необщем контексте, ниже, [UPDATE], но это не является полезным в качестве обходного пути, так как абоненты могут использовать только свойство самого объекта.

private func2(o:Object, prop: keyof(Object)): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2: number = val as number 
    } 
} 

Это глупый пример, который я извлек, чтобы сосредоточиться на проблеме; если реальный контекст поможет, дайте мне знать.

+0

Вам нужно отдать его на номер? Не выведен ли тип? –

+1

@MuratK. Такая же ошибка (с несколько иной формулировкой) возникает, если я не произнесения. Я включил актерский состав, потому что, если бы я этого не сделал, я бы получил комментарии, которые я должен попробовать! ;-) –

+0

Если кто-нибудь еще эксперт может объяснить, ПОЧЕМУ, что в этом случае не работает типограф, я был бы благодарен. Мне интересно, писать ли на нем проблему (отчет об ошибке). –

ответ

1

Я новичок в машинопись, но кажется, что вы должны удвоить брось, как было предложено here

private func1<T extends Object>(o:T, prop: keyof(T)): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2: number = val as any as number 
    } 

Кроме того, вы можете использовать его, как это может быть? Я прочитал его, по крайней мере, в документах. Section Index Types

private func<T extends Object, K extends keyof T>(o: T, prop: K): void { 
    const val = o[prop] 
    if (typeof val === 'number') { 
     const v2 = val as any as number 
    } 
} 

Надеюсь, это поможет.