Тип Union позволит вам сделать это. В этом случае у вас есть два варианта:
- Оставьте интерфейсы такими, добавив тип Union, например:
type File = AwsValue | NormalFile
Затем добавьте функцию с защитой типа в Чтобы различать:
function isAwsValue(file: File): file is AwsValue {
return file.hasOwnProperty('bucket'); // Or whatever control you would like to do at runtime
}
Используйте
различающееся объединение , добавляя свойство
type
(или любое другое имя) к каждому интерфейсу, все еще добавляя
File
тип объединения:
interface AwsValue {
type: 'aws',
// ...
}
interface NormalFile {
type: 'normal',
// ...
}
type File = AwsValue | NormalFile
Тогда вы можете просто подтвердить свой код type
:
let file: File = /* ... */;
if (file.type === 'aws') {
// file.bucket, etc. Now TS will suggest you props assuming `file` is an `AwsValue`
}