2013-10-18 35 views
6

我有辦法將類型註釋直接應用於對象文字嗎?直接我的意思是不必將其分配給一個類型註釋的變量。例如: 我知道我能做到這一點是這樣的:如何在TypeScript中指定一個類型化的對象字面值?

export interface IBaseInfo {} 
export interface IMyInfo extends IBaseInfo { name: string; } 
function testA(): IBaseInfo = { 
    var result: IMyInfo = { name: 'Hey!' }; 
    return result; 
} 

我也能做到這一點是這樣的:

function testB(): IBaseInfo = { 
    return { name: 'Hey!' }; 
} 

但我需要的是這樣的:

function testC(): IBaseInfo = { 
    return { name: 'Hey!' }: IMyInfo; // <--- doesn't work 
} 

或者像這樣:

function testD(): IBaseInfo = { 
    return IMyInfo: { name: 'Hey!' }; // <--- doesn't work 
} 
+0

請問你能解釋爲什麼「需要類似」第三和第四個例子嗎? –

+0

@DavidNorman,爲了啓用智能感應自動補全 –

+0

您想在哪裏使用智能感知?在第三和第四個示例中,您可以在任何地方使用智能感知。在第一個例子中,intellisense在var上工作。你可以擴展一個例子來解釋你想要的intellisense嗎? –

回答

6

答案是使用身份識別功能:

function to<a>(value: a): a { return value; } 
const instance = to<SomeInterface>({ 
    prop1: 'text', 
    prop2: 123 
}); 
0

你的第一個和第二個例子失敗了,所以你不能這樣做。 :)

很確定你不必在你的文字上指定任何類型。只要你的文字符合界面要求,你就很好。

interface IMyInfo { name: string; } 
var asdf = { 
    name: "test" 
} 

var qwer: IMyInfo = asdf; 

如果你想智能感知,你必須做一些事情,如:

enter image description here

或者,也許這是你在找什麼。 Intellisense至少在操場上工作。

enter image description here

或者,也許這一點。 :)

enter image description here

+0

儘管我不需要明確地指定它,只要能夠推斷出類型,我希望我可以這樣做,以便在定義該對象文字時具有Intellisense支持 –

+0

解決了我的答案。 –

+0

你不明白,我不想把我的對象分配給一個變量(在你的例子中的「東西」),以便有智能感知幫助,我問的是如果有一種方法來註釋對象字面值iteself並因此具有智能感知幫助跳過將其分配給變量 –

15

智能感知爲對象文字的成員由表達式的上下文類型(見規範的章節4.19)提供。

您可以通過各種方式獲取上下文類型。一些其中應用上下文類型中最常見的地方是:

  • 變量與類型註釋的初始化
  • return聲明函數或表達與返回類型註解的getter
  • 在類型斷言表達的表達(<T>expr

在您的例子,你可以使用一個類型斷言來迫使你的對象文本有一個上下文類型:

function testB() { 
    return <IMyInfo>{ name: 'Hey!' }; 
} 
+0

當涉及交集類型時,Aleksey的技術很好,因爲它可以確保具有更多屬性的類型的所需屬性。例如:https://gist.github.com/brandonbloom/494d46eaf5851646c3eb8733bfaf7035 –

+0

我更喜歡這種方法,因爲它也避免了在lambda表達式中生成類型時的不明確性,因爲第一個字符是<而不是{。 –

2

請記住,接口遵循duck typing:如果一個對象看起來像匹配接口,它確實匹配接口。

所以

function testB(): IBaseInfo = { 
    return { name: 'Hey!' }; 
} 

是完全一樣的

function testA(): IBaseInfo = { 
    var result: IMyInfo = { name: 'Hey!' }; 
    return result; 
} 

無論哪種方式,返回的對象看起來像一個IMyInfo,因此它是一個IMyInfo。函數內部沒有發生什麼影響它匹配的接口。

但是,在您的示例中,函數的返回值是IBaseInfo,因此編譯器和智能感知將假定該對象只是一個IBaseInfo。如果你想要的功能的調用者就知道返回值是一個IMyInfo,你需要做的功能IMyInfo的返回值:

function testB(): IMyInfo = { 
    return { name: 'Hey!' }; 
} 

或使用類型推斷,只需

function testB() = { 
    return { name: 'Hey!' }; 
} 
+0

謝謝,我知道鴨子打字和類型推斷。但問題是關於一個不同的事情。 –

+0

已更新,以討論智能感知功能之外。 –

+0

我寫的例子是我正在處理的一些代碼的簡化版本。我這樣說並不是把注意力從焦點上的事情中吸引掉。我不能只返回IMyInfo而不是IBaseInfo,因爲原始函數返回IMyInfo的實例或從IBaseInfo繼承的另一種類型的實例。所以IBaseInfo是共同點。正如Ryan指出的那樣,通過使用類型斷言運算符,您可以告訴編譯器使用IMyInfo作爲結果值的類型(即使該函數使用IBaseInfo註釋)。我檢查了它,它的工作就像我想的那樣。 –

相關問題