假設我們有一些帶有name屬性的介面(可能還有其他介面):
interface Circle {
name: 'circle',
radius: number
}
interface Sphere {
name: 'sphere',
radius: number
}
interface Square {
name: 'square',
side: number
}
type GeometricalObject = Circle | Sphere | Square;
現在,假設我們有一個函式:
doSomething(name: SomeType) {
...
}
有沒有辦法以編程方式確保name引數的doSomething()函式name型別是 GeometricalObject 中可能的屬性型別的并集(即“圓”|“球”|“正方形”,在這種特定情況下)?
typeof GeometricalObject.name如果可能的話,我在想象類似的東西。
uj5u.com熱心網友回復:
interface Circle {
name: 'circle',
radius: number
}
interface Sphere {
name: 'sphere',
radius: number
}
interface Square {
name: 'square',
side: number
}
type GeometricalObject = Circle | Sphere | Square;
type Name = GeometricalObject["name"]; // "circle" | "sphere" | "square"
有可能的; 它使用括號表示法而不是點表示法。
操場
uj5u.com熱心網友回復:
你可以做這樣的事情
interface Circle {
name: 'circle',
radius: number
}
interface Sphere {
name: 'sphere',
radius: number
}
interface Square {
name: 'square',
side: number
}
type GeometricalObject = Circle | Sphere | Square;
type GeometricalObjectType = Circle['name'] | Sphere['name'] | Square['name'];
function doSomething(name: GeometricalObjectType) {
switch(name) {
case 'circle':
break;
case 'sphere':
break;
case 'square':
break;
}
}
TS游樂場:https://www.typescriptlang.org/play?ssl=29&ssc=1&pln=1&pc=1#code/AQ4SwOwFwUwJwGYEMDGNgGExxQG3QN4BQopwESAtjAFzADkK2eM9ANCWSHEgCZgBXAM50IAygCN4nEAF8iM8NHjI0wAMoAHABbxCi0hWp16QnXvYHQPfsNHipcRfMWRYiVOnUBHAUjj6XCBGtAxCvv6sHEHAQmC8oWKS0qQupFAAnproAOIwAPbUUHBgKEi4APISAFYwKFDAALyYzPjAAD4a5gEdGhEBANwK6Vm5BUUlZZU1dVAAKqNNLTj4ANr0IfQAur1augHrmzudPn4HG1SsW0OkCAIQ9WD5EMC8 eqFMFDakADmABQhOh5T7FUrlKq1eoLbIASmAxBiQgA7mAoChtIDLvDETFQGUhOhGK1WDQrFwJAEkABrG54kAEolmfak8lkSkwGl0 mMsL9Vn0kAcrls SpIhAA
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/436890.html
標籤:打字稿
