2017-07-23 56 views
0

我知道打字稿的一些優點是啓用類型安全功能 -
但是有可能確保我的功能只能獲得具有特定鍵的對象或換句話說 - 具體結構的對象?強制一個函數只接受特定結構的對象(在打字稿/ js中)

我知道的很多優雅的方式來測試一個套疊的鍵存在,如[這一個] [1],
當然我可以運行在我的函數開始時的小查 - 但我之所以問這是因爲我的函數會被其他許多程序員使用 - 我想確保他們能夠理解他們應該從函數的簽名中插入什麼輸入。

例子:

function printName(user){ 
    console.log(user.details.name); // I want to ensure details.name exist 
} 

,我也希望有這樣一些特點:

function (user : {details: {name : string}}){ 
    //same ... 
} 


[1]: https://stackoverflow.com/questions/2631001/javascript-test-for-existence-of-nested-object-key#answer-4034468 "this one" 
+3

嘗試過TypeScript'interface'? https://www.typescriptlang.org/docs/handbook/interfaces.html –

+2

我建議再次運行TS文檔。這是非常基本的。順便說一下,你是否嘗試過你提供的代碼?發生了什麼?另外,你能否澄清一下,「細節」是唯一的財產,還是事先已知的幾個? –

回答

-1

使用一類可能是最可讀的方式

class User { 
    details: {name: string}; 
} 

function printName(user: User) { ... } 

這樣做的好處方法是,它更短,並且當您的User模型更改時,您不必更新y我們的函數的頭球

+0

但現在我必須實例化所有用戶對象。 –

+0

@torazaburo你在說什麼?您必須將某個對象傳遞給函數 – Dummy

-1

可以使用接口在typescript

export interface Details{ 
    name:string, 
    age: number 
} 
export interface User{ 
    details : { 
     [key: string]: Details 
    }; 
} 

function printName(user : User){} 
+1

由於'Details'接口不是直接嵌套在'User'下,因此這不起作用。 – ideaboxer

2
interface User { 
    details:{name: string} 
} 

function printName(user:User){ 
    console.log(user.details.name); // I want to ensure details.name exist 
} 
0

你的願望而這也正是功能:

function printName(user: { [key: string]: any, details: { [key: string]: any, name: string }}) { 
    console.log(user.details.name) 
} 

允許任何性質需要details + name

更清晰,防止意外改變的保護:

// oftentimes you put the following interfaces in extra files: 
interface Details { 
    readonly [key: string]: any // = allow other properties than "name"* 
    readonly name: string 
} 
interface User { 
    readonly [key: string]: any // = allow other properties than "details"* 
    readonly details: Details 
} 
// *) consider explicitly specifying them 

function printName(user: User) { 
    console.log(user.details.name) 
} 

,並使用下面的代碼,如果你知道其他開發人員可以從普通的JavaScript代碼(不打字稿代碼)調用你的函數:

function printName(user: User) { 
    const name = ((user || <User>{}).details || <Details>{}).name 
    if(name == void 0) { 
     console.error("user name missing") 
    } 
    console.log(name) 
} 

Code on TypeScript Playground

+0

你什麼都沒有保證。 '[key:string]:any'是'name:string'的直接超集,因此被吞下。你基本上輸入了'user:{[key:string]:any}'。 –

+0

我已經添加了Playground鏈接,以便您可以試用。 – ideaboxer

+0

我會修改,在這種情況下,'[key:string]:any'是多餘的,因爲這是從接口隱含的。 –

相關問題