型の別名 (type) の使用
- 共用体型の型定義が長すぎる問題を解決するには
- 型の別名を使用する
type myname = number | string
function hander1(name: myname) {
console.log(name)
if (typeof name === 'string') {
console.log(name.length)
}
}
function hander2(x: number,y:number,z?:number) {
}
type myx={
x: number,y:number,z?:number}
function hander3(mytype:myx) {
}
インターフェース宣言の使用
- キーワードはインターフェイスを使用して宣言されます
- 型エイリアスと比較すると、少ない =
interface myX2 {
x: number
y: number
z?: number
}
function hander4(mytype: myX2) {
}
2 つの違い:
- 型エイリアスはインターフェイス宣言に非常に似ており、オブジェクトを定義するときに任意に使用できます。
- 主な違い:
- タイプタイプはより広い範囲で使用されます
- type はエイリアスを定義します。同じ名前を持つ 2 つのエイリアスは許可されません
type myname = number | string
- 1. インターフェイス型はオブジェクトの宣言にのみ使用できます。
- 2. インターフェイス型がオブジェクトを宣言する場合、複数回宣言できます。
- 3. インターフェースタイプは継承をサポートします
- 4. インターフェイス タイプはクラスによる実装をサポートします。
interface myX2 {
x: number
y: number
}
interface myX2 {
z?: number
}
function hander4(mytype: myX2) {
}
interface myX2 {
x: number
y: number
}
interface myX3 extends myX2 {
z?: number
}
function hander5(mytype: myX3) {
console.log(mytype.x,mytype.y,mytype.z)
}
hander5({
x:1,y:2,z:3})
和集合型と交差型
共用体型
- ts を使用すると、さまざまな演算子を使用して既存の型から新しい型を構築できます。
- 共用体型 2 つ以上の型から構成される型
- 表現は次のタイプの値のいずれかになります
- 共用体型の各型は共用体のメンバーと呼ばれます。
function hander(name: number | string) {
console.log(name)
}
hander(1)
hander("123")
let nainfo: number | string = "abc"
nainfo = 1
nainfo = "123"
function hander1(name: number | string) {
console.log(name)
if (typeof name === 'string') {
console.log(name.length)
}
}
hander1(1)
hander1("123")
- 知らせ:
- 共用体型の値を取得した後、それはどのような型でもよいので、どのように使用するのでしょうか?
- 数値の取得と同様に、文字列の一部のメソッドは使用できません
- 解決する:
- 縮小されたコレクション、つまり型の縮小を使用し、縮小されたコードに基づいてより具体的な型を推論する必要があります。
クロスタイプ
- 交差するタイプは、複数のタイプの条件を満たす必要があることを示します
- 交差タイプではアンパサンドを使用します
type myY = number & string
type myY2 = number & string
interface myX2 {
x: number
y: number
}
interface myX3 {
z?: number
p: () => void
}
const info: myX2 & myX3 = {
x: 1,
y:2,
p:()=>{
console.log("方法")
}
}
型アサーション
- ts は特定のクォータ タイプ情報を取得できない場合があり、このときはタイプ アサーションが必要です
- TS では、型アサーションをより具体的な、またはより具体的でないバージョンの型に変換することのみが許可されます。このルールにより、不可能なキャストが防止されます。
DOM要素を取得する
const imgE1 = document.querySelector("img")
if (imgE1 != null) {
imgE1.src = ""
}
const imgE2 = document.querySelector(".img") as HTMLImageElement
imgE2.src = ""
- 似たような、こんな感じ。型アサーションは次のように具体的ではなくなります。
const num = 12
const num2 =num as any
- 先に進み、あまり具体的でないタイプをより具体的にアサートすることもできます
- ただし、このような前後のアサーションはサポートされていないため、潜在的なセキュリティ リスクがあります。
const num = 12
const num2 =num as any
const num3 =num2 as string
非null型アサーション
- 渡された値が未定義の可能性がある場合、現時点ではメソッドを実行できません
- シンボル! を使用すると、特定の識別子に値があることを確認する必要があり、コンパイル段階での TS の検出をスキップできます。
interface hander{
name:string,
age:number,
size?:number
}
const info: hander={
name:"乞力马扎罗",
age:18
}
console.log(info?.size)
if(info.size){
info.size=23
}
info!.size=23
console.log(info.size)
リテラル型の使用
- 割り当てられた値を型として扱い、使用する場合はリテラルのみを使用します。
- デフォルトではあまり意味がありませんが、複数のタイプを結合することは可能です。あなたはそのうちの 1 人だけになることができます。
type numtype = "left" | "top" | "up"
const num3: numtype = "left"
type requestype = "get" | "post"
function reqest(url: string, method: requestype) {
}
reqest('http//xxx.com', 'get')
type requestype = "get" | "post"
function reqest(url: string, method: requestype) {
}
const hander={
url:'xxx',
method:'post'
}
reqest('http//xxx.com',hander.method as "post")
const hander1 :{
url:string,method:'post'}={
url:'xxx',
method:'post'
} as const
reqest('http//xxx.com',hander1.method)
const hander2={
url:'xxx',
method:'post'
} as const
reqest('http//xxx.com',hander2.method)
型の絞り込み (型の絞り込み)
- 次のような判定文を使用することで、ts の実行パスを変更できます。
if(info.size){
info.size=23
}
- このようなステートメントはタイプ ガードとも呼ばれます
- 特定の実行パスでは、宣言された型よりも小さい型を絞り込むことができます。このプロセスは絞り込みと呼ばれます。
- 一般的な保護の種類
- typeof、返された型を確認する
type requestype = "get" | "post"
function reqest(url: string, method: requestype) {
if(typeof url ==='string'){
console.log(url)
}
}
- 等価絞り込み (=== と !== と == など)、文字通りの判断
type requestype = "get" | "post"
function reqest(url: string, method: requestype) {
if(method==="get"){
console.log(method)
}
}
- instanceof、それがこのインスタンスであるかどうかを示します
function reqest(data:string|Date) {
if(data instanceof Date){
console.log(data.getTime())
}
}
- in 、オブジェクトに名前付きのプロパティがあるかどうかを判断するために使用される in 演算子
- 等…
TypeScript 関数の種類
関数型式
- 関数タイプの式は、関数タイプを表すように記述できます。
- tsでは関数型の仮パラメータ名は省略できません
const fun: (num2: number) => number = (arg: number): number => {
return 123
}
type funtype = (num2: number) => number
const fun2: funtype = (arg: number) => {
return 123
}
function cals(func) {
const num1 = 12
const num2 = 13
const res = func(num1, num2)
}
function func1(num1, num2) {
return num1 + num2
}
cals(func1)
type calstype = (num1: number, num2: number) => number
function cals1(func: calstype) {
const num1 = 12
const num2 = 13
const res = func(num1, num2)
}
function func2(num1: number, num2: number) {
return num1 * num2
}
cals1(func2)
内部ルールの検出
interface gule {
name: string
age: number
}
const p = {
name: "山头",
age: 12,
size: '大'
}
const info: gule = p
関数呼び出しのシグネチャ
- js では、関数は呼び出されるだけでなく、属性値を持つこともできます。
- 型式はプロパティの宣言をサポートしていません
- プロパティを持つ関数が必要な場合は、オブジェクト型に呼び出しシグネチャを記述します
type obj2 = (num1: number) => number
interface obj {
name: string
age: number
(num1: number): number
}
const func: obj = (num1: number): number => {
return 123
}
func(123)
それらをどのように選択すればよいでしょうか?
- 関数の型そのものを記述する(関数の型を呼び出すことができる)だけの場合は、関数式を使用します
- 関数を呼び出し可能で他のプロパティも持つオブジェクトとして記述する場合は、関数呼び出しシグネチャを使用します。
オプションのパラメータのタイプ
- オプションのパラメータは必須パラメータの後に配置する必要があります
function fun(x:number,y?:number){
console.log(x,y)
if(y!=undefined){
console.log(y)
}
}
fun(1)
パラメータのデフォルト値
function fun(x:number,y=100){
console.log(x,y)
if(y!=undefined){
console.log(y)
}
}
fun(1)
残りのパラメータ
- 残りのパラメーター構文を使用すると、無限の数のパラメーターを配列として表すことができます。
- 残りのパラメータを使用して、仮パラメータが固定されていない合計を計算する関数を定義できます。
function sum (first, ...args) {
console.log(first);
console.log(args);
}
sum(10, 20, 30);
function fun(...arrs: (string| number)[]) {
}
fun(1,2,3,'4')
関数のオーバーロード
- ts では、さまざまなオーバーロード関数を記述して、関数をさまざまな方法で呼び出すことができることを示すことができます。
- 一般に、2 つ以上のオーバーロードされた署名が書き込まれます。次に、一般的な関数を記述して実装します。
function add2(n1:number, n2:number):number
function add2(n1:string, n2:string):string
function add2(n1:any, n2:any) {
return n1 + n2
}
console.log(add2(1,2))
console.log(add2("1","2"))
関数のオーバーロード - 共用体型 (推奨使用)
function add2(arg:string|any[]) {
return arg.length
}
console.log(add2("123"))